1+ # Bellman Ford Algorithm for Shortest Path 
2+ 
3+ import  sys 
4+ 
5+ # Function to create Nodes 
6+ class  Node (object ):
7+     def  __init__ (self ,name ):
8+         self .name  =  name 
9+         self .visited  =  False 
10+         self .predecessor  =  None 
11+         self .adjacencyList  =  []
12+         # Distance from starting vertex/Node 
13+         self .minDistance  =  sys .maxsize 
14+ 
15+ # Function to create Edges 
16+ class  Edge (object ):
17+     def  __init__ (self , weight , startVertex , targetVertex ):
18+         self .weight  =  weight 
19+         self .startVertex  =  startVertex 
20+         self .targetVertex  =  targetVertex 
21+ 
22+ 
23+ # Bellman Ford Algorithm 
24+ class  BellmanFord (object ):
25+     # Initially set the Negative cycle flag to False 
26+     HAS_CYCLE  =  False 
27+ 
28+     # Calculate the Shortest Path 
29+     def  calculateShortestPath (self , vertexList , edgeList , startVertex ):
30+         startVertex .minDistance  =  0 
31+         for  i  in  range (0 ,len (vertexList )- 1 ):
32+             for  edge  in  edgeList :
33+                 u  =  edge .startVertex 
34+                 v  =  edge .targetVertex 
35+ 
36+                 newDistance  =  u .minDistance  +  edge .weight 
37+                 if  newDistance  <  v .minDistance :
38+                     v .minDistance  =  newDistance 
39+                     v .predecessor  =  u 
40+ 
41+         for  edge  in  edgeList :
42+             if  self .hasCycle (edge ):
43+                 print ('Negative cycle detected...' )
44+                 BellmanFord .HAS_CYCLE = True 
45+ 
46+ 
47+     # Check if a negative cycle exists or not 
48+     def  hasCycle (self ,edge ):
49+         if  (edge .startVertex .minDistance  +  edge .weight ) <  edge .targetVertex .minDistance :
50+             return  True 
51+         else :
52+             return  False 
53+ 
54+ 
55+     # Traceback and Print the Shortest Path 
56+     def  getShortestPath (self , targetVertex ):
57+         if  not  BellmanFord .HAS_CYCLE :
58+             print ('Shortest path exists with value: ' , targetVertex .minDistance )
59+             node  =  targetVertex 
60+             while  node  is  not None :
61+                 print ('%s'  %  node .name )
62+                 node  =  node .predecessor 
63+         else :
64+             print ('Negative cycle detected...' )
65+ 
66+ 
67+ 
68+ 
69+ # -------------------------- Testing ------------------------------ 
70+ if  __name__  ==  '__main__' :
71+     # Create Nodes 
72+     node1  =  Node ('A' )
73+     node2  =  Node ('B' )
74+     node3  =  Node ('C' )
75+     node4  =  Node ('D' )
76+     node5  =  Node ('E' )
77+     node6  =  Node ('F' )
78+     node7  =  Node ('G' )
79+     node8  =  Node ('H' )
80+ 
81+     # Create Edges 
82+     # Edge Weight, Starting Vertex, Ending Vertex 
83+     edge1  =  Edge (5 ,node1 , node2 )
84+     edge2  =  Edge (8 , node1 , node8 )
85+     edge3  =  Edge (9 , node1 , node5 )
86+     edge4  =  Edge (15 , node2 , node4 )
87+     edge5  =  Edge (12 , node2 , node3 )
88+     edge6  =  Edge (4 , node2 , node8 )
89+     edge7  =  Edge (7 , node8 , node3 )
90+     edge8  =  Edge (6 , node8 , node6 )
91+     edge9  =  Edge (5 , node5 , node8 )
92+     edge10  =  Edge (4 , node5 , node6 )
93+     edge11  =  Edge (20 , node5 , node7 )
94+     edge12  =  Edge (1 , node6 , node3 )
95+     edge13  =  Edge (13 , node6 , node7 )
96+     edge14  =  Edge (3 , node3 , node4 )
97+     edge15  =  Edge (11 , node3 , node7 )
98+     edge16  =  Edge (9 , node4 , node7 )
99+ 
100+     # Adjacency List, append edges 
101+     node1 .adjacencyList .append (edge1 )
102+     node1 .adjacencyList .append (edge2 )
103+     node1 .adjacencyList .append (edge3 )
104+     node2 .adjacencyList .append (edge4 )
105+     node2 .adjacencyList .append (edge5 )
106+     node2 .adjacencyList .append (edge6 )
107+     node8 .adjacencyList .append (edge7 )
108+     node8 .adjacencyList .append (edge8 )
109+     node5 .adjacencyList .append (edge9 )
110+     node5 .adjacencyList .append (edge10 )
111+     node5 .adjacencyList .append (edge11 )
112+     node6 .adjacencyList .append (edge12 )
113+     node6 .adjacencyList .append (edge13 )
114+     node3 .adjacencyList .append (edge14 )
115+     node3 .adjacencyList .append (edge15 )
116+     node4 .adjacencyList .append (edge16 )
117+ 
118+     # Vertex List 
119+     vertexList  =  (node1 , node2 , node3 , node4 , node5 , node6 , node7 , node8 )
120+     edgeList  =  (edge1 , edge2 , edge3 , edge4 , edge5 , edge6 , edge7 , edge8 , edge9 , edge10 , edge11 , edge12 , edge13 , edge14 , edge15 , edge16 )
121+ 
122+     algorithm  =  BellmanFord ()
123+     # Calculate Shortest Path with start Vertex node1 : "A" 
124+     algorithm .calculateShortestPath (vertexList , edgeList , node1 )
125+     # Get the Shortest Path from node1: "A" to node7: "G" 
126+     algorithm .getShortestPath (node7 )
127+     # Get the Shortest Path from node1: "A" to node4: "D" 
128+     algorithm .getShortestPath (node4 )
129+ 
130+ # ----------------------------- EOC ------------------------------- 
0 commit comments