Skip to content

Commit 8fab2d9

Browse files
committed
Prims
1 parent 92e9250 commit 8fab2d9

File tree

1 file changed

+123
-0
lines changed

1 file changed

+123
-0
lines changed

Graph/prims.py

Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
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

Comments
 (0)