Skip to content

Commit fc83a9d

Browse files
committed
Added Dijkstra's single source shortest paths algorithm
1 parent 5f10396 commit fc83a9d

File tree

2 files changed

+42
-0
lines changed

2 files changed

+42
-0
lines changed

data-structures/WeightedGraph.py

+42
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,47 @@ def kruskal(self):
2929
forest.union(edge[0], edge[1])
3030
return ans
3131

32+
def edge_exists(self, start, vertex):
33+
for edge in self.edges:
34+
if start == edge[0] and vertex == edge[1]:
35+
return (True, edge[2])
36+
return (False, -1)
37+
38+
def minimum_dist(self, distance, visited):
39+
minimum = float("inf")
40+
min_index = -1
41+
for vert in self.vertices:
42+
if distance[vert] < minimum and vert not in visited:
43+
minimum = distance[vert]
44+
min_index = vert
45+
46+
return min_index
47+
48+
def get_weight(self, start, end):
49+
for edge in self.edges:
50+
if start == edge[0] and end == edge[1]:
51+
return edge[2]
52+
return float("inf")
53+
54+
def dijkstra_single_source(self, start):
55+
visited = []
56+
distance = [0] * len(self.vertices)
57+
for vertex in self.vertices:
58+
(exists, weight) = self.edge_exists(start, vertex)
59+
if vertex != start and exists:
60+
distance[vertex] = weight
61+
else:
62+
distance[vertex] = float("inf")
63+
while len(visited) != len(self.vertices):
64+
u = self.minimum_dist(distance, visited)
65+
visited.append(u)
66+
for vert in self.vertices:
67+
if vert not in visited:
68+
distance[vert] = min(
69+
distance[vert], distance[u] + self.get_weight(u, vert))
70+
71+
print(distance)
72+
3273

3374
if __name__ == "__main__":
3475
g = WeightedGraph()
@@ -43,3 +84,4 @@ def kruskal(self):
4384
g.add_edge(4, 5, 5)
4485
g.add_edge(5, 6, 3)
4586
print(g.kruskal())
87+
g.dijkstra_single_source(0)

data-structures/graph_visualized.png

7.63 KB
Loading

0 commit comments

Comments
 (0)