Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 9b7b010

Browse files
Prim’s algorithm in Python
1 parent 14426d5 commit 9b7b010

File tree

1 file changed

+227
-0
lines changed

1 file changed

+227
-0
lines changed

‎Graph/prims-algorithm.py

Lines changed: 227 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,227 @@
1+
# Copyright (C) Deepali Srivastava - All Rights Reserved
2+
# This code is part of DSA course available on CourseGalaxy.com
3+
4+
from sys import maxsize as INFINITY
5+
6+
TEMPORARY = 1
7+
PERMANENT = 2
8+
9+
class Vertex:
10+
def __init__(self, name):
11+
self.name = name
12+
13+
14+
class UndirectedWeightedGraph:
15+
16+
def __init__(self,size=20):
17+
self._adj = [ [0 for column in range(size)] for row in range(size) ]
18+
self._n = 0
19+
self._vertexList = []
20+
21+
22+
def display(self):
23+
for i in range(self._n):
24+
for j in range(self._n):
25+
print( self._adj[i][j], end =' ')
26+
print()
27+
28+
29+
def numVertices(self):
30+
return self._n
31+
32+
33+
def numEdges(self):
34+
e = 0
35+
for i in range(self._n):
36+
for j in range(i):
37+
if self._adj[i][j]!=0:
38+
e+=1
39+
return e
40+
41+
42+
def vertices(self):
43+
return [vertex.name for vertex in self._vertexList]
44+
45+
46+
def edges(self):
47+
edges = []
48+
for i in range(self._n):
49+
for j in range(i):
50+
if self._adj[i][j] != 0:
51+
edges.append( (self._vertexList[i].name, self._vertexList[j].name, self._adj[i][j]) )
52+
return edges
53+
54+
55+
def _getIndex(self,s):
56+
index = 0
57+
for name in (vertex.name for vertex in self._vertexList):
58+
if s == name:
59+
return index
60+
index += 1
61+
return None
62+
63+
64+
def insertVertex(self,name):
65+
if name in (vertex.name for vertex in self._vertexList): ########
66+
print("Vertex with this name already present in the graph")
67+
return
68+
self._vertexList.append( Vertex(name) )
69+
self._n += 1
70+
71+
72+
def removeVertex(self,name):
73+
u = self._getIndex(name)
74+
if u is None:
75+
print("Vertex not present in the graph")
76+
return
77+
78+
self._adj.pop(u)
79+
80+
for i in range(self._n):
81+
self._adj[i].pop(u)
82+
83+
self._vertexList.pop(u)
84+
self._n -= 1
85+
86+
87+
def insertEdge(self, s1, s2, w):
88+
u = self._getIndex(s1)
89+
v = self._getIndex(s2)
90+
if u is None:
91+
print("First vertex not present in the graph")
92+
elif v is None:
93+
print("Second vertex not present in the graph")
94+
elif u == v:
95+
print("Not a valid edge")
96+
elif self._adj[u][v] != 0 :
97+
print("Edge already present in the graph")
98+
else:
99+
self._adj[u][v] = w
100+
self._adj[v][u] = w
101+
102+
103+
def removeEdge(self, s1,s2):
104+
u = self._getIndex(s1)
105+
v = self._getIndex(s2)
106+
if u is None:
107+
print("First vertex not present in the graph")
108+
elif v is None:
109+
print("Second vertex not present in the graph")
110+
elif self._adj[u][v] == 0:
111+
print("Edge not present in the graph")
112+
else:
113+
self._adj[u][v] = 0
114+
self._adj[v][u] = 0
115+
116+
117+
def isAdjacent(self, s1, s2):
118+
u = self._getIndex(s1)
119+
v = self._getIndex(s2)
120+
if u is None:
121+
print("First vertex not present in the graph")
122+
return False
123+
elif v is None:
124+
print("Second vertex not present in the graph")
125+
return False
126+
return False if self._adj[u][v] == 0 else True
127+
128+
129+
def degree(self,s):
130+
131+
u = self._getIndex(s)
132+
if u is None:
133+
print("Vertex not present in the graph")
134+
return
135+
136+
deg = 0
137+
for v in range(self._n):
138+
if self._adj[u][v] != 0 :
139+
deg += 1
140+
return deg
141+
142+
def prims(self):
143+
edgesInTree = 0
144+
wtTree = 0
145+
146+
for v in range(self._n):
147+
self._vertexList[v].status = TEMPORARY
148+
self._vertexList[v].length = INFINITY
149+
self._vertexList[v].predecessor = None
150+
151+
root = 0
152+
self._vertexList[root].length = 0
153+
154+
while True:
155+
c = self._tempVertexMinL()
156+
157+
if c == None:
158+
if edgesInTree == self._n-1:
159+
print("Weight of minimum spanning tree is", wtTree)
160+
else:
161+
print("Graph is not connected, Spanning tree not possible")
162+
return
163+
164+
self._vertexList[c].status = PERMANENT
165+
166+
# Include edge ( self._vertexList[c].predecessor,c ) in the tree
167+
if c != root:
168+
edgesInTree += 1
169+
print("(", self._vertexList[c].predecessor, "," ,c, ")")
170+
wtTree = wtTree + self._adj[self._vertexList[c].predecessor][c]
171+
172+
for v in range(self._n):
173+
if self._adj[c][v] and self._vertexList[v].status == TEMPORARY:
174+
if self._adj[c][v] < self._vertexList[v].length:
175+
self._vertexList[v].length = self._adj[c][v]
176+
self._vertexList[v].predecessor = c
177+
178+
179+
def _tempVertexMinL(self):
180+
min = INFINITY
181+
x = None
182+
183+
for v in range(self._n):
184+
if self._vertexList[v].status == TEMPORARY and self._vertexList[v].length < min :
185+
min = self._vertexList[v].length
186+
x = v
187+
return x
188+
189+
190+
if __name__ == '__main__':
191+
192+
g = UndirectedWeightedGraph()
193+
194+
g.insertVertex("Zero")
195+
g.insertVertex("One")
196+
g.insertVertex("Two")
197+
g.insertVertex("Three")
198+
g.insertVertex("Four")
199+
g.insertVertex("Five")
200+
g.insertVertex("Six")
201+
g.insertVertex("Seven")
202+
g.insertVertex("Eight")
203+
g.insertVertex("Nine")
204+
205+
g.insertEdge("Zero", "One", 19)
206+
g.insertEdge("Zero", "Three", 14)
207+
g.insertEdge("Zero", "Four", 12)
208+
g.insertEdge("One", "Two", 20)
209+
g.insertEdge("One", "Four", 18)
210+
g.insertEdge("Two", "Four", 17)
211+
g.insertEdge("Two", "Five", 15)
212+
g.insertEdge("Two", "Nine", 29)
213+
g.insertEdge("Three", "Four", 13)
214+
g.insertEdge("Three", "Six", 28)
215+
g.insertEdge("Four", "Five", 16)
216+
g.insertEdge("Four", "Six", 21)
217+
g.insertEdge("Four", "Seven", 22)
218+
g.insertEdge("Four", "Eight", 24)
219+
g.insertEdge("Five", "Eight", 26)
220+
g.insertEdge("Five", "Nine", 27)
221+
g.insertEdge("Six", "Seven", 23)
222+
g.insertEdge("Seven", "Eight", 30)
223+
g.insertEdge("Eight", "Nine", 35)
224+
225+
g.prims()
226+
227+

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /