所以,我有这个图,我想使用广度优先搜索算法来查看是否存在从顶点到另一个顶点的路径。
所以,我在python中实现了一个函数,它返回true或false,具体取决于路径的存在并且它有效。嗯,它适用于我做的测试。我想知道的是,这确实是一种先呼吸搜索算法。我之前没有看过任何BFS算法,我只知道它的基本思想。我听说BFS是递归实现的,虽然我是迭代实现的,这就是为什么我对它有疑问。所以,这里是我的图的函数和表示:
├── lib
├── src
│ ├── ac_d
│ ├── at_d
│ ├── bp_d
│ ├── fm_d
│ ├── hm_d
│ ├── pi_d
│ ├── pv_d
│ ├── ra_d
│ └── rc_d
└── test
我最后的问题是:BFS本质上是否找到了从顶点到另一个顶点的最短路径?我在网上看到这个东西,我想确定。
答案 0 :(得分:1)
这是一个BFS算法,用于查找路径是否存在,但它不会告诉您该路径是什么,并且不会考虑字典的结构来表示图形的方式。
这是上图的BFS示例,它可以处理字典表示图形的方式。它在找到路径时返回路径,在路径不存在时返回False。如果您只是希望它在找到路径时返回True,请将第19行编辑为return True
def BFS2(graph, v1, v2):
'''
graph: a dictionary representing an unweighted graph
v1: a key in graph, representing the start node
v2: a key and value in graph, representing the end node
returns: a shortest path from v1 to v2, False if there is no path.
'''
if v1 not in graph:
return False
path_start = [v1]
paths = [path_start]
while len(paths):
test_path = paths.pop(0)
last_node = test_path[-1]
for next_node in graph[last_node]:
if next_node not in test_path:
next_path = test_path + [next_node]
if next_node == v2:
paths.append(next_path)
return next_path
elif next_node in graph:
paths.append(next_path)
return False
答案 1 :(得分:1)
这是广度优先搜索。它遵循一个相当典型的结构,将搜索边界视为队列(尽管列表是队列的低效选择),并且它按照与根的距离的顺序来考虑节点,就像标准的广度优先搜索一样。
然而,这也是错误的。对于current not in outb
之类的搜索,BFS(1, 18)
终止条件会导致wrongly output False
,while current in parsed: current = toParse.pop(0)
循环会耗尽toParse
并在尝试弹出时引发异常一个空列表,demonstrated here,图表略有不同。此外,您的outb
与它应该代表的图表的图片不匹配;它缺少一堆后边缘,例如6-> 4。
答案 2 :(得分:-1)