1+ import sys ;
2+
3+ class Node (object ):
4+
5+ def __init__ (self , name ):
6+ self .name = name ;
7+ self .visited = False ;
8+ self .predecessor = None ;
9+ self .adjacenciesList = [];
10+ self .minDistance = sys .maxsize ;
11+
12+ class Edge (object ):
13+
14+ def __init__ (self , weight , startVertex , targetVertex ):
15+ self .weight = weight ;
16+ self .startVertex = startVertex ;
17+ self .targetVertex = targetVertex ;
18+
19+ class BellmanFord (object ):
20+
21+ HAS_CYCLE = False ;
22+
23+ def calculateShortestPath (self , vertexList , edgeList , startVertex ):
24+
25+ startVertex .minDistance = 0 ;
26+
27+ for i in range (0 ,len (vertexList )- 1 ):
28+ for edge in edgeList :
29+
30+ u = edge .startVertex ;
31+ v = edge .targetVertex ;
32+
33+ newDistance = u .minDistance + edge .weight ;
34+
35+ if newDistance < v .minDistance :
36+ v .minDistance = newDistance ;
37+ v .predecessor = u ;
38+
39+ for edge in edgeList :
40+ if self .hasCycle (edge ):
41+ print ("Negative cycle detected..." );
42+ BellmanFord .HAS_CYCLE = True ;
43+ return ;
44+
45+ def hasCycle (self , edge ):
46+ if (edge .startVertex .minDistance + edge .weight ) < edge .targetVertex .minDistance :
47+ return True ;
48+ else :
49+ return False ;
50+
51+ def getShortestPathTo (self , targetVertex ):
52+
53+ if not BellmanFord .HAS_CYCLE :
54+ print ("Shortest path exists with value: " , targetVertex .minDistance );
55+
56+ node = targetVertex ;
57+
58+ while node is not None :
59+ print ("%s " % node .name );
60+ node = node .predecessor ;
61+ else :
62+ print ("Negative cycle detected..." );
63+
64+
65+ node1 = Node ("A" );
66+ node2 = Node ("B" );
67+ node3 = Node ("C" );
68+ node4 = Node ("D" );
69+ node5 = Node ("E" );
70+ node6 = Node ("F" );
71+ node7 = Node ("G" );
72+ node8 = Node ("H" );
73+
74+ edge1 = Edge (5 ,node1 ,node2 );
75+ edge2 = Edge (8 ,node1 ,node8 );
76+ edge3 = Edge (9 ,node1 ,node5 );
77+ edge4 = Edge (15 ,node2 ,node4 );
78+ edge5 = Edge (12 ,node2 ,node3 );
79+ edge6 = Edge (4 ,node2 ,node8 );
80+ edge7 = Edge (7 ,node8 ,node3 );
81+ edge8 = Edge (6 ,node8 ,node6 );
82+ edge9 = Edge (5 ,node5 ,node8 );
83+ edge10 = Edge (4 ,node5 ,node6 );
84+ edge11 = Edge (20 ,node5 ,node7 );
85+ edge12 = Edge (1 ,node6 ,node3 );
86+ edge13 = Edge (13 ,node6 ,node7 );
87+ edge14 = Edge (3 ,node3 ,node4 );
88+ edge15 = Edge (11 ,node3 ,node7 );
89+ edge16 = Edge (9 ,node4 ,node7 );
90+
91+ edge17 = Edge (1 ,node1 ,node2 );
92+ edge18 = Edge (1 ,node2 ,node3 );
93+ edge19 = Edge (- 3 ,node3 ,node1 );
94+
95+ node1 .adjacenciesList .append (edge1 );
96+ node1 .adjacenciesList .append (edge2 );
97+ node1 .adjacenciesList .append (edge3 );
98+ node2 .adjacenciesList .append (edge4 );
99+ node2 .adjacenciesList .append (edge5 );
100+ node2 .adjacenciesList .append (edge6 );
101+ node8 .adjacenciesList .append (edge7 );
102+ node8 .adjacenciesList .append (edge8 );
103+ node5 .adjacenciesList .append (edge9 );
104+ node5 .adjacenciesList .append (edge10 );
105+ node5 .adjacenciesList .append (edge11 );
106+ node6 .adjacenciesList .append (edge12 );
107+ node6 .adjacenciesList .append (edge13 );
108+ node3 .adjacenciesList .append (edge14 );
109+ node3 .adjacenciesList .append (edge15 );
110+ node4 .adjacenciesList .append (edge16 );
111+
112+
113+ vertexList = (node1 ,node2 ,node3 , node4 , node5 , node6 , node7 , node8 );
114+ #edgeList = (edge1,edge2,edge3,edge4,edge5,edge6,edge7,edge8,edge9,edge10,edge11,edge12,edge13,edge14,edge15,edge16);
115+ edgeList = (edge17 , edge18 , edge19 );
116+
117+ algorithm = BellmanFord ();
118+ algorithm .calculateShortestPath (vertexList , edgeList , node1 );
119+ algorithm .getShortestPathTo (node7 );
0 commit comments