1+ import heapq
2+
3+ class Vertex ():
4+
5+ def __init__ (self , name ):
6+ self .name = name
7+ self .visited = False
8+ self .predecessor = None
9+ self .adjacencyList = []
10+
11+ def __str__ (self ):
12+ return self .name
13+
14+ class Edge ():
15+
16+ def __init__ (self , weight , startVertex , targetVertex ):
17+ self .weight = weight
18+ self .startVertex = startVertex
19+ self .targetVertex = targetVertex
20+
21+ def __lt__ (self , other ):
22+ selfPriority = self .weight ;
23+ otherPriority = other .weight ;
24+ return selfPriority < otherPriority ;
25+
26+ class PrimsJarnik ():
27+
28+ def __init__ (self , unvisitedList ):
29+ self .unvisitedList = unvisitedList
30+ self .spanningTree = []
31+ self .edgeHeap = []
32+ self .fullCost = 0
33+
34+ def calculateSpanningTree (self , vertex ):
35+ self .unvisitedList .remove (vertex );
36+ while self .unvisitedList :
37+
38+ for edge in vertex .adjacencyList :
39+ if edge .targetVertex in self .unvisitedList :
40+ heapq .heappush (self .edgeHeap , edge );
41+
42+ minEdge = heapq .heappop (self .edgeHeap );
43+
44+ if minEdge .targetVertex in self .unvisitedList :
45+ self .spanningTree .append (minEdge )
46+ print ("Edge added to spanning tree: %s - %s" % (minEdge .startVertex .name ,minEdge .targetVertex .name ))
47+ self .fullCost += minEdge .weight
48+ vertex = minEdge .targetVertex
49+ self .unvisitedList .remove (vertex )
50+
51+ def getSpanningTree (self ):
52+ return self .spanningTree
53+
54+ def getCost (self ):
55+ return self .fullCost
56+
57+
58+ vertexA = Vertex ("A" )
59+ vertexB = Vertex ("B" )
60+ vertexC = Vertex ("C" )
61+ vertexD = Vertex ("D" )
62+ vertexE = Vertex ("E" )
63+ vertexF = Vertex ("F" )
64+ vertexG = Vertex ("G" )
65+
66+ edgeAB = Edge (2 , vertexA , vertexB )
67+ edgeBA = Edge (2 , vertexB , vertexA )
68+ edgeAE = Edge (5 , vertexA , vertexE )
69+ edgeEA = Edge (5 , vertexE , vertexA )
70+ edgeAC = Edge (6 , vertexA , vertexC )
71+ edgeCA = Edge (6 , vertexC , vertexA )
72+ edgeAF = Edge (10 , vertexA , vertexF )
73+ edgeFA = Edge (10 , vertexF , vertexA )
74+ edgeBE = Edge (3 , vertexB , vertexE )
75+ edgeEB = Edge (3 , vertexE , vertexB )
76+ edgeBD = Edge (3 , vertexB , vertexD )
77+ edgeDB = Edge (3 , vertexD , vertexB )
78+ edgeCD = Edge (1 , vertexC , vertexD )
79+ edgeDC = Edge (1 , vertexD , vertexC )
80+ edgeCF = Edge (2 , vertexC , vertexF )
81+ edgeFC = Edge (2 , vertexF , vertexC )
82+ edgeDE = Edge (4 , vertexD , vertexE )
83+ edgeED = Edge (4 , vertexE , vertexD )
84+ edgeDG = Edge (5 , vertexD , vertexG )
85+ edgeGD = Edge (5 , vertexG , vertexD )
86+ edgeFG = Edge (3 , vertexF , vertexG )
87+ edgeGF = Edge (3 , vertexG , vertexF )
88+
89+ unvisitedList = []
90+ unvisitedList .append (vertexA )
91+ unvisitedList .append (vertexB )
92+ unvisitedList .append (vertexC )
93+ unvisitedList .append (vertexD )
94+ unvisitedList .append (vertexE )
95+ unvisitedList .append (vertexF )
96+ unvisitedList .append (vertexG )
97+
98+ vertexA .adjacencyList .append (edgeAB )
99+ vertexA .adjacencyList .append (edgeAC )
100+ vertexA .adjacencyList .append (edgeAE )
101+ vertexA .adjacencyList .append (edgeAF )
102+ vertexB .adjacencyList .append (edgeBA )
103+ vertexB .adjacencyList .append (edgeBD )
104+ vertexB .adjacencyList .append (edgeBE )
105+ vertexC .adjacencyList .append (edgeCA )
106+ vertexC .adjacencyList .append (edgeCD )
107+ vertexC .adjacencyList .append (edgeCF )
108+ vertexD .adjacencyList .append (edgeDB )
109+ vertexD .adjacencyList .append (edgeDC )
110+ vertexD .adjacencyList .append (edgeDE )
111+ vertexD .adjacencyList .append (edgeDG )
112+ vertexE .adjacencyList .append (edgeEA )
113+ vertexE .adjacencyList .append (edgeEB )
114+ vertexE .adjacencyList .append (edgeED )
115+ vertexF .adjacencyList .append (edgeFA )
116+ vertexF .adjacencyList .append (edgeFC )
117+ vertexF .adjacencyList .append (edgeFG )
118+ vertexG .adjacencyList .append (edgeGD )
119+ vertexG .adjacencyList .append (edgeGF )
120+
121+ algorithm = PrimsJarnik (unvisitedList )
122+ algorithm .calculateSpanningTree (vertexD )
123+ print (algorithm .getCost ())
0 commit comments