Skip to content

Commit 15b2124

Browse files
authored
Merge pull request #174 from bettoarcaya/adding-dijkstra-algorithm
Adding dijkstra algorithm
2 parents 36a6300 + 5fafa2a commit 15b2124

File tree

1 file changed

+68
-0
lines changed

1 file changed

+68
-0
lines changed
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
from collections import defaultdict
2+
import math
3+
4+
class Graph:
5+
def __init__(self):
6+
self.nodes = set()
7+
self.archs = defaultdict(list)
8+
self.values = {}
9+
10+
def add_node(self, value):
11+
self.nodes.add(value)
12+
13+
def add_edge(self, init_node, final_node, value):
14+
self.archs[init_node].append(final_node)
15+
self.archs[init_node].append(final_node)
16+
self.values[(init_node, final_node)] = value
17+
18+
19+
def dijkstra(graph, initial):
20+
visited = {initial: 0}
21+
22+
nodes = set(graph.nodes)
23+
24+
while nodes:
25+
min_node = None
26+
for node in nodes:
27+
if node in visited:
28+
if min_node is None:
29+
min_node = node
30+
elif visited[node] < visited[min_node]:
31+
min_node = node
32+
33+
if min_node is None:
34+
break
35+
36+
nodes.remove(min_node)
37+
current_weight = visited[min_node]
38+
39+
for arch in graph.archs[min_node]:
40+
try:
41+
weight = current_weight + graph.values[(min_node, arch)]
42+
except:
43+
weight = current_weight + math.inf
44+
if arch not in visited or weight < visited[arch]:
45+
visited[arch] = weight
46+
47+
return visited
48+
49+
50+
def main():
51+
52+
#initializing values
53+
g = Graph()
54+
g.add_node('a')
55+
g.add_node('b')
56+
g.add_node('c')
57+
g.add_node('d')
58+
59+
g.add_edge('a', 'b', 10)
60+
g.add_edge('b', 'c', 2)
61+
g.add_edge('a', 'c', 1)
62+
g.add_edge('c', 'd', 1)
63+
g.add_edge('b', 'd', 8)
64+
65+
#output
66+
print(dijkstra(g, 'a'))
67+
68+
main()

0 commit comments

Comments
 (0)