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