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.
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:
[0, 4, 15, 25, 21, 11, 9, 8, 15] # Index represents the vertex
Expected 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.
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. It returns the index of first adjacent index, not the one with minimal distance.
This function should look like:
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
.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.