[英]Dijkstra's algorithm Python
Given a graph and a source vertex in the graph, find the shortest paths from source to all vertices in the given graph.给定一个图和图中的一个源顶点,找到从源到给定图中所有顶点的最短路径。 Read more here -> Link
在这里阅读更多-> 链接
Please go through my code and help me out by pointing what's wrong with my logic.请通过我的代码 go 并通过指出我的逻辑有什么问题来帮助我。
My code:我的代码:
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))
Current Output:当前 Output:
[0, 4, 15, 25, 21, 11, 9, 8, 15] # Index represents the vertex
Expected Output预计 Output
[0, 4, 12, 19, 21, 11, 9, 8 ,14]
The problem was with the function that checks the min distance, We need to update the current max so that we can compare it with other unvisited vertices and see if another vertex exists with a lesser value.问题出在检查最小距离的 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
There is an error in minDist
method. minDist
方法有错误。 It returns the index of first adjacent index, not the one with minimal distance.它返回第一个相邻索引的索引,而不是距离最小的索引。
This function should look like:这个 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
Also, I am not sure that you have to assign both vertList[u]
and vertList[v]
in addEdge
.另外,我不确定您是否必须在 addEdge 中同时分配
vertList[u]
和addEdge
vertList[v]
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.