@@ -8,79 +8,79 @@ class JohnsonGraph:
8
8
def __init__ (self ):
9
9
self .edges = []
10
10
self .graph = {}
11
-
12
- #add vertices for a graph
11
+
12
+ # add vertices for a graph
13
13
def add_vertices (self , u ):
14
14
self .graph [u ] = []
15
-
16
- #assign weights for each edges formed of the directed graph
15
+
16
+ # assign weights for each edges formed of the directed graph
17
17
def add_edge (self , u , v , w ):
18
18
self .edges .append ((u , v , w ))
19
- self .graph [u ].append ((v ,w ))
19
+ self .graph [u ].append ((v , w ))
20
20
21
- #perform a dijkstra algorithm on a directed graph
21
+ # perform a dijkstra algorithm on a directed graph
22
22
def dijkstra (self , s ):
23
23
distances = {vertex : sys .maxsize - 1 for vertex in self .graph }
24
24
pq = [(0 ,s )]
25
25
26
26
distances [s ] = 0
27
27
while pq :
28
28
weight , v = heapq .heappop (pq )
29
-
29
+
30
30
if weight > distances [v ]:
31
31
continue
32
-
32
+
33
33
for node , w in self .graph [v ]:
34
- if distances [v ]+ w < distances [node ]:
35
- distances [node ] = distances [v ]+ w
36
- heapq .heappush (pq , (distances [node ], node ))
34
+ if distances [v ] + w < distances [node ]:
35
+ distances [node ] = distances [v ] + w
36
+ heapq .heappush (pq , (distances [node ], node ))
37
37
return distances
38
38
39
39
#carry out the bellman ford algorithm for a node and estimate its distance vector
40
40
def bellman_ford (self , s ):
41
41
distances = {vertex : sys .maxsize - 1 for vertex in self .graph }
42
42
distances [s ] = 0
43
-
43
+
44
44
for u in self .graph :
45
45
for u , v , w in self .edges :
46
- if distances [u ] != sys .maxsize - 1 and distances [u ]+ w < distances [v ]:
47
- distances [v ] = distances [u ]+ w
46
+ if distances [u ] != sys .maxsize - 1 and distances [u ] + w < distances [v ]:
47
+ distances [v ] = distances [u ] + w
48
48
49
49
return distances
50
50
51
51
#perform the johnson algorithm to handle the negative weights that
52
52
# could not be handled by either the dijkstra
53
53
#or the bellman ford algorithm efficiently
54
54
def johnson_algo (self ):
55
-
56
55
self .add_vertices ("#" )
57
56
for v in self .graph :
58
57
if v != "#" :
59
58
self .add_edge ("#" , v , 0 )
60
-
59
+
61
60
n = self .bellman_ford ("#" )
62
-
61
+
63
62
for i in range (len (self .edges )):
64
63
u , v , weight = self .edges [i ]
65
64
self .edges [i ] = (u , v , weight + n [u ] - n [v ])
66
65
67
66
self .graph .pop ("#" )
68
67
self .edges = [(u , v , w ) for u , v , w in self .edges if u != "#" ]
69
-
68
+
70
69
for u in self .graph :
71
70
self .graph [u ] = [(v , weight ) for x , v , weight in self .edges if x == u ]
72
-
71
+
73
72
distances = []
74
73
for u in self .graph :
75
74
new_dist = self .dijkstra (u )
76
75
for v in self .graph :
77
- if new_dist [v ] < sys .maxsize - 1 :
76
+ if new_dist [v ] < sys .maxsize - 1 :
78
77
new_dist [v ] += n [v ] - n [u ]
79
78
distances .append (new_dist )
80
79
return distances
81
-
80
+
81
+
82
82
g = JohnsonGraph ()
83
- #this a complete connected graph
83
+ # this a complete connected graph
84
84
g .add_vertices ("A" )
85
85
g .add_vertices ("B" )
86
86
g .add_vertices ("C" )
@@ -97,4 +97,4 @@ def johnson_algo(self):
97
97
optimal_paths = g .johnson_algo ()
98
98
print ("Print all optimal paths of a graph using Johnson Algorithm" )
99
99
for i , row in enumerate (optimal_paths ):
100
- print (f"{ i } : { row } " )
100
+ print (f"{ i } : { row } " )
0 commit comments