柠檬图库C++ - 有向图

Lemon Graph Library C++ - Directed Graph

本文关键字:有向图 C++ 柠檬      更新时间:2023-10-16

我正在寻找Lemon来处理我的寻路,因为它具有搜索和最短路径算法等。

问题是,我已经在一开始就了解了 Lemon 的工作原理,他们有一个教程但没有论坛可以问。

我对有向图的理解是,你有一个节点,它可以链接到或不链接到另一个节点,然后你有一个权重。

例:

     A    B    C
A    0    1    0
B    1    0    5
C    0    0    0

在这种情况下,A连接到权重为 1 的BC 连接到任何内容(因此一旦你到达C你就被卡住了),B连接到值为 1 的AB连接到值为 5 的C

本教程说要做这样的事情:

ListDigraph g;
ListDigraph::Node A = g.addNode();
ListDigraph::Node B = g.addNode();
ListDigraph::Node C = g.addNode();

所以现在我有一个包含三个节点的图形g。现在怎么办?在哪里/如何添加连接信息以及权重值?

来自柠檬教程

  ListDigraph g;
  ListDigraph::Node x = g.addNode();
  ListDigraph::Node y = g.addNode();
  ListDigraph::Node z = g.addNode();
  g.addArc(x,y);
  g.addArc(y,z);
  g.addArc(z,x);

从来没有使用过这个图书馆的头脑,我只是引用我读过的东西。

LEMON 使用的术语与大多数图论文本略有不同,但在我看来,这使得使用库更容易一些。

首先,LEMON中边和弧的区别很简单,边是两个节点之间的向边,而弧是有向边。


至于添加边和权重之类的,图本身只管理节点和边/弧,与每个节点相关联的唯一数据是一个完整的标识符。

您可以使用以下方法找到此标识符:

graph.id(node);

要将数据片段附加到节点/边,请使用映射。有几种不同类型的映射,但它们通常归结为NodeMapEdgeMapArcMap - 而且,正如你可能猜到的,它们分别是<Node, V><Edge, V><Arc, V>的关联映射,其中V是值类型(可以是任何具有默认构造函数的东西)。


要添加边(在无向图中)或弧(在二合图中),您只需创建两个节点,然后使用 .addEdge(n1, n2).addArc(n1, n2)

例如:

ListDigraph graph;
ListDigraph::Node n1 = graph.addNode();
ListDigraph::Node n2 = graph.addNode();
ListDigraph::Arc a = graph.addArc(n1, n2);

并将某个值与该弧相关联:

ArcMap<std::string> arcMap;
arcMap[a] = "This is an arc value!";