[英]Dijkstra's algorithm Python
给定一个图和图中的一个源顶点,找到从源到给定图中所有顶点的最短路径。 在这里阅读更多-> 链接
请通过我的代码 go 并通过指出我的逻辑有什么问题来帮助我。
我的代码:
from collections import defaultdict
global INT_MAX
INT_MAX = 3 ** 38
class Graph:
def __init__(self, numofVertices):
self.vertList = defaultdict(list)
self.numofVertices = numofVertices
def addEdge(self, u, v, cost):
self.vertList[u].append((v, cost))
self.vertList[v].append((u, cost))
def minDist(self, dist, visited):
for v in range(self.numofVertices):
if dist[v] < INT_MAX and v not in visited:
minIndex = v
return minIndex
def dijsktra(self, src):
dist = [INT_MAX] * self.numofVertices
dist[src] = 0
visited = set()
for _ in range(self.numofVertices):
minVertex = self.minDist(dist, visited)
visited.add(minVertex)
for nbr, edgeCost in self.vertList[minVertex]:
if dist[nbr] > dist[minVertex] + edgeCost and nbr not in visited:
dist[nbr] = dist[minVertex] + edgeCost
return dist
g = Graph(9)
g.addEdge(0, 1, 4)
g.addEdge(0, 7, 8)
g.addEdge(1, 7, 11)
g.addEdge(7, 8, 7)
g.addEdge(7, 6, 1)
g.addEdge(7, 1, 11)
g.addEdge(1, 2, 8)
g.addEdge(2, 3, 7)
g.addEdge(2, 5, 4)
g.addEdge(2, 8, 2)
g.addEdge(6, 8, 6)
g.addEdge(6, 5, 2)
g.addEdge(5, 2, 4)
g.addEdge(5, 3, 14)
g.addEdge(5, 4, 10)
g.addEdge(3, 4, 9)
print(g.dijsktra(0))
当前 Output:
[0, 4, 15, 25, 21, 11, 9, 8, 15] # Index represents the vertex
预计 Output
[0, 4, 12, 19, 21, 11, 9, 8 ,14]
问题出在检查最小距离的 function 上,我们需要更新当前的最大值,以便我们可以将其与其他未访问的顶点进行比较,并查看是否存在另一个具有较小值的顶点。
def minDist(self, dist, visited):
max1 = 3 ** 38
minIndex = 0
for v in range(self.numofVertices):
if dist[v] < max1 and v not in visited:
max1 = dist[v]
minIndex = v
return minIndex
minDist
方法有错误。 它返回第一个相邻索引的索引,而不是距离最小的索引。
这个 function 应该如下所示:
def minDist(self, dist, visited):
m = INT_MAX
for v in range(self.numofVertices):
if dist[v] < m and v not in visited:
m = dist[v]
minIndex = v
return minIndex
另外,我不确定您是否必须在 addEdge 中同时分配vertList[u]
和addEdge
vertList[v]
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.