在 Python 中使用列表的列表以广度优先遍历图
Traversing a Graph in Breadth First in Python Using a List of List
所以我看到广度优先搜索经常使用字典来实现。我只想知道是否可以使用列表的列表来遍历图形。然后返回 parent 数组。 [每个顶点的parents。]如果是这样,怎么样?说,我有一个像这样的邻接列表
G = [[(1, None), (2, None)], [(0, None)], []]
其中 G 是有向未加权图。因此 NONE。否则它会有一个数字。 vertex(0) 与vertex(1) 和vertex(2) 相邻。顶点 (1) 仅与顶点 (0) 相邻。顶点 (2) 不与任何顶点相邻。
我应该先创建一个新的顶点列表吗?我应该摆脱体重吗?我不确定如何处理这个问题。你能帮忙的话,我会很高兴。谢谢
当然,任何一种方式都可以。您可以这样表示图表:
g = [[1, 2], [0], []]
然后 g[g[j][0]]
返回第 j
个元素的邻接列表中第一个顶点的邻接列表。列表的列表和键为 0,...,n
且值为 int
的列表的字典之间没有区别,但在我看来,除非需要字典,否则列表是一个更明智的想法。如果没有重量,就没有理由为所有重量设置 None
。
但是请注意,BFS 将要求您跟踪某个顶点是否已被访问,您可以在跟踪父节点的同时进行此操作:
parents = [None, None, None]
您通常还希望在访问节点时跟踪当前所处的深度(除非您仅测试连接性),您可以这样做:
import collections
Vertex = collections.namedtuple("Vertex", ["idx", "depth"])
现在,当您从队列中弹出一个顶点 v
时,您会遍历其邻接列表中的每个 u_idx
。如果 parents[u_idx] is None
(尚未访问过),则将 Vertex(u_idx, v.depth + 1)
推入您的队列并标记 parents[u_idx] = v
.
所以我看到广度优先搜索经常使用字典来实现。我只想知道是否可以使用列表的列表来遍历图形。然后返回 parent 数组。 [每个顶点的parents。]如果是这样,怎么样?说,我有一个像这样的邻接列表
G = [[(1, None), (2, None)], [(0, None)], []]
其中 G 是有向未加权图。因此 NONE。否则它会有一个数字。 vertex(0) 与vertex(1) 和vertex(2) 相邻。顶点 (1) 仅与顶点 (0) 相邻。顶点 (2) 不与任何顶点相邻。
我应该先创建一个新的顶点列表吗?我应该摆脱体重吗?我不确定如何处理这个问题。你能帮忙的话,我会很高兴。谢谢
当然,任何一种方式都可以。您可以这样表示图表:
g = [[1, 2], [0], []]
然后 g[g[j][0]]
返回第 j
个元素的邻接列表中第一个顶点的邻接列表。列表的列表和键为 0,...,n
且值为 int
的列表的字典之间没有区别,但在我看来,除非需要字典,否则列表是一个更明智的想法。如果没有重量,就没有理由为所有重量设置 None
。
但是请注意,BFS 将要求您跟踪某个顶点是否已被访问,您可以在跟踪父节点的同时进行此操作:
parents = [None, None, None]
您通常还希望在访问节点时跟踪当前所处的深度(除非您仅测试连接性),您可以这样做:
import collections
Vertex = collections.namedtuple("Vertex", ["idx", "depth"])
现在,当您从队列中弹出一个顶点 v
时,您会遍历其邻接列表中的每个 u_idx
。如果 parents[u_idx] is None
(尚未访问过),则将 Vertex(u_idx, v.depth + 1)
推入您的队列并标记 parents[u_idx] = v
.