Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中使用列表以广度优先遍历图形_Python_Algorithm_List_Graph_Breadth First Search - Fatal编程技术网

在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然后将其父节点设置为自身。这是一个相当小的问题。