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