C++ 什么是邻接列表?如何编写邻接列表?

C++ 什么是邻接列表?如何编写邻接列表?,c++,graph,adjacency-list,C++,Graph,Adjacency List,下面是一个邻接列表的示例。但是,我看不出与单个链表有什么区别?这里还有一个例子,它说它是一个列表中的所有边(一个图,离散数学类型),这是非常广泛的,如果我有一个图,这不是一个路径图。如何对邻接列表进行编码 struct Node { std::vector<std::shared_ptr<Node>> Neighbors; }; struct AdjacencyList{ std::vector<std::shared_ptr<Node>

下面是一个邻接列表的示例。但是,我看不出与单个链表有什么区别?这里还有一个例子,它说它是一个列表中的所有边(一个图,离散数学类型),这是非常广泛的,如果我有一个图,这不是一个路径图。如何对邻接列表进行编码

struct Node {
    std::vector<std::shared_ptr<Node>> Neighbors;
};
struct AdjacencyList{
    std::vector<std::shared_ptr<Node>> Nodes;
};
AdjacencyList
包含指向
A
B
C
D
E
F
的指针
A
有指向
B
C
的指针
B
有指向
A
D
E
的指针
C
有指向
A
的指针
D
有指向
B
E
的指针。
E
有指向
B
D
的指针
F
没有指向其他节点的指针


邻接列表必须包含指针而不是
节点
值,否则当它调整大小时,所有的
邻接指针都将无效。

因此,Boost在Boost::graph中包含一个邻接列表容器

一般来说,邻接列表不仅仅是一个单链表。它描述了图中任何顶点到其他顶点的直接连接(可能是给定方向的连接)


提供了一些带有图片的基本示例。

一个简单的示例:假设您有一个顶点类型
顶点
。它们是指图形由一组顶点组成,可以实现为:

std::unordered_set<Vertex> vertices;
(为此,您需要一种枚举顶点的方法。在无向图中,邻接矩阵是对称的;在有向图中,不需要对称。)


如果边较少,列表表示更好,而如果边较多,矩阵表示更好。

您已经介绍了列表和矩阵。您确定它是邻接列表吗?邻接列表不仅仅是边/顶点对的列表。在我知道正确的学术术语之前,我在纸上做了这件事,试图解决一个难题。
std::unordered_set<Vertex> vertices;
typedef std::pair<Vertex, Vertex> Edge;
std::list<Edge> edges_as_list;
std::unordered_set<Edge> edges_as_set;
bool edges_as_matrix[vertices.size()][vertices.size()]; // `vector` is better
// edges_as_matrix[i][j] = true if there's an edge