存储图形(邻接列表)

邻接列表是用于表示有限图的无序列表的集合。每个列表描述图中顶点的邻居集。存储图形需要较少的内存。

让我们看一个图表及其邻接矩阵: http://i.stack.imgur.com/PwJ3D.jpg

现在我们使用这些值创建一个列表。

http://i.stack.imgur.com/WEEcx.jpg

这称为邻接列表。它显示哪些节点连接到哪些节点。我们可以使用 2D 数组存储此信息。但是我们会花费与 Adjacency Matrix 相同的内存。相反,我们将使用动态分配的内存来存储这个内存。

许多语言都支持 VectorList ,我们可以使用它来存储邻接列表。对于这些,我们不需要指定 List 的大小。我们只需要指定最大节点数。

伪代码将是:

Procedure Adjacency-List(maxN, E):       // maxN denotes the maximum number of nodes
edge[maxN] = Vector()                    // E denotes the number of edges
for i from 1 to E
    input -> x, y                        // Here x, y denotes there is an edge between x, y
    edge[x].push(y)
    edge[y].push(x)
end for
Return edge

由于这是一个无向图,它有一条从 xy 的边,还有一条从 yx 的边。如果它是有向图,我们将省略第二个。对于加权图,我们也需要存储成本。我们将创建另一个名为 cost []的向量列表来存储它们。伪代码: ****

Procedure Adjacency-List(maxN, E):
edge[maxN] = Vector()
cost[maxN] = Vector()
for i from 1 to E
    input -> x, y, w
    edge[x].push(y)
    cost[x].push(w)
end for
Return edge, cost

从这一点,我们可以很容易地找出连接到任何节点的节点总数,以及这些节点是什么。它比 Adjacency Matrix 花费的时间更少。但是如果我们需要找出 uv 之间是否存在优势,那么如果我们保留一个邻接矩阵就会更容易。