在斯坦福算法讲座中,Roughgarden 教授列出了邻接表的以下成分:
- 数组或顶点列表
- 边的数组或列表
- 顶点列表中的每个顶点都指向入射在其上的边。
- 边列表中的每条边都指向它的边点。
如何在 python 中实现这一点,尤其是 3 和 4 的组合?这对我来说一直是个挑战。我在 C++ 中使用指针完成了该操作。我可以想到一种方法,如果您认为它是正确的,请告诉我。数字 4 可以通过一个元组列表来完成,
Edges = [(1,2),(3,2),(4,1)]
或者向元组添加另一个元素以获得权重值。如何使 List of Vertices 指向事件的边缘呢?
Vertices = {1 : [0,2] 2: [0,1] 3: [1] 4:[3]}
这里 Vertices 是一个字典,每个键(顶点)的值是包含键(顶点)的边的索引列表。这看起来合理吗?
好的,我也会给出它的C++实现。
struct Node;
struct Arcs; //Forward declarations as each of them references each other
using namespace std
struct SimpleGraph // Has all the nodes
{
set<Node *> nodes;
set<Arc *> arcs;
}
//Node contains node_number and the set of arcs/edges from this node.
struct Node
{
int node_number;
set<Arc *> arcs;
}
// Arc contains start and finish node and the cost associated with the Arc/Edge
struct Arc
{
Node* start;
Node* finish;
double cost;
}
因为我们在 C++ 中使用指针,所以 Arc 信息的变化会自动反映在节点中。缺少指针使得在 python 中很难做到这一点。所以我努力做到我能做到的最好。