在Python中使用列表以广度优先遍历图形
所以我经常看到使用字典实现广度优先搜索。我只是想知道是否有可能使用列表的列表遍历一个图。然后返回父数组。[每个顶点的父顶点。]如果是,如何?喂,我有一个这样的邻接列表在Python中使用列表以广度优先遍历图形,python,algorithm,list,graph,breadth-first-search,Python,Algorithm,List,Graph,Breadth First Search,所以我经常看到使用字典实现广度优先搜索。我只是想知道是否有可能使用列表的列表遍历一个图。然后返回父数组。[每个顶点的父顶点。]如果是,如何?喂,我有一个这样的邻接列表 G = [[(1, None), (2, None)], [(0, None)], []] 其中G是有向无权图。因此,没有。否则它会有一个数字。顶点0与顶点1和顶点2相邻。顶点1仅与顶点0相邻。顶点2与任何顶点都不相邻 我应该先创建一个新的顶点列表吗?我应该减肥吗?我不知道该怎么做。任何帮助都很好。谢谢当然可以,两种方式都
G = [[(1, None), (2, None)], [(0, None)], []]
其中G是有向无权图。因此,没有。否则它会有一个数字。顶点0与顶点1和顶点2相邻。顶点1仅与顶点0相邻。顶点2与任何顶点都不相邻
我应该先创建一个新的顶点列表吗?我应该减肥吗?我不知道该怎么做。任何帮助都很好。谢谢当然可以,两种方式都可以。您可以这样表示图形:
g = [[1, 2], [0], []]
然后g[g[j][0]]返回第j个元素邻接列表中第一个顶点的邻接列表。列表列表和键为0,…,n且值为int列表的字典没有区别,但在我看来,列表是一个更明智的想法,除非需要字典。如果没有任何东西有重量,那么你的所有重量都没有理由没有
但是,请注意,BFS将要求您跟踪顶点是否已被访问,您可以在跟踪父顶点的同时执行以下操作:
parents = [None, None, None]
通常,您还希望在访问节点时跟踪当前所处的深度,除非您仅测试(例如)连接性,您可以使用:
import collections
Vertex = collections.namedtuple("Vertex", ["idx", "depth"])
现在,当您从队列中弹出一个顶点v时,您将遍历其邻接列表中的每个u_idx。如果parents[u_idx]为None,则尚未访问它,然后将Vertexu idx,v.depth+1推到您的队列中,并标记parents[u_idx]=v.如果图中的节点是从0到n的数字,则表示为列表或列表的dict实际上没有区别。感谢您的回复!如何跟踪父节点?@RylaiCrestfall我在一个解决方案中添加了@PatrickCollins,使用父数组跟踪访问的顶点效果不好,因为初始顶点被访问,而其父节点没有。@citxx然后将其父节点设置为自身。这是一个相当小的问题。