【发布时间】:2017-08-16 19:11:30
【问题描述】:
这可能充其量只是一个初学者问题,但一直在玩图表,并在各种练习中实施 BFS 搜索。我不太清楚如何实际跟踪我访问过的边的权重,以便创建图形的最小完整跨度。我的图表格式为:
{0: [(1, 1), (2, 1)], 1: [(0, 1), (2, 1)], 2: [(1, 1), (0, 1)]}
其中第一个顶点为0,相邻顶点为1和2,权重分别为1和1。所以更清楚地说,图字典中的键代表顶点,键值中的每个元组代表一个顶点、权重对。
所以我的 BFS 功能是:
def bfs(graph, start):
"""returns total weight needed to visit
each vertice in the graph with the minimum
overall weight possible"""
if [] in graph.values():
return "Not Possible"
weight = 0
visited, queue = set(), [start]
while queue:
vertex = queue.pop(0)
if vertex not in visited:
visited.add(vertex)
for node in graph[vertex]:
queue.append(node[0])
weight += node[1]
return weight
目前,使用我的原始图表,此函数将返回 6,它应该是 2。我认为这是因为它正在迭代每个顶点并添加相邻的权重,即使它们已经被访问过。
这实际上也不会选择最小加权路径,它只会跟踪它所采取的路径的权重,无论它可能是什么。我该如何解决这个问题?
一个更长的例子:
{0: [(1, 5), (2, 7), (3, 12)], 1: [(0, 5), (2, 9), (4, 7)], 2: [(0, 7), (1, 9), (3, 4), (4, 4), (5, 3)], 3: [(0, 12), (2, 4), (5, 7)], 4: [(1, 7), (2, 4), (5, 2), (6, 5)], 5: [(2, 3), (3, 7), (4, 2), (6, 2)], 6: [(4, 5), (5, 2)]}
这会产生134 的权重,其中正确答案应该是23
是否有一些我缺少的算法可以跟踪加权边缘并从中选择最佳路径?
我知道 Dijkstra 算法,但据我所知,它适用于具有指定起点和终点的路径,而不是完整的图形跨度?
【问题讨论】: