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