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