我有一个代表有向图的字典。例如......
myDict = {'foo': ['hello', 'stack'], 'bar' : ['over', 'flow']}
这意味着'foo'节点指向'hello'和'stack',而'bar'< / strong>节点指向'over'和'flow'。
我还编写了执行广度优先搜索的代码,以找到任意两个节点之间的最短路径......
from collections import deque
def breadthFirstSearch(graph, start, end):
q = deque()
path = (start, )
q.append(path)
visited = set([start])
while q:
path = q.popleft()
last_node = path[-1]
if last_node == end:
return path
for node in graph[last_node]:
if node not in visited:
visited.add(node)
q.append(path + (node,))
print 'There is no path from ' + start + ' to ' + end + '.'
return None
我的问题是:是否可以修改此广度优先搜索,以便为我提供最大的最短路径以及该路径的起始和结束节点?
答案 0 :(得分:1)
您的问题被称为“图形直径问题。”
广度优先搜索创建广度优先搜索树。通常,由于存在非树边缘,两个节点之间的最长树路径将长于它们之间的最长路径。所以不,你不能让BFS直接这样做。
BFS会把它钉在树上,但它有点不重要。
有一种称为“词典宽度优先搜索”的变体可以找到一些受限类图的直径。我遇到LBFS工作的那些图表类看起来很像树。
编辑:当然,您可以从每个节点开始运行BFS,并找出BFS报告的最长路径。或者你可以使用非常优雅的Floyd-Warshall algorithm。