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 14426d5

Browse files
Warshall’s algorithm in Python
1 parent 719639e commit 14426d5

File tree

1 file changed

+192
-0
lines changed

1 file changed

+192
-0
lines changed

‎Graph/warshalls-algorithm.py

Lines changed: 192 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,192 @@
1+
# Copyright (C) Deepali Srivastava - All Rights Reserved
2+
# This code is part of DSA course available on CourseGalaxy.com
3+
4+
class Vertex:
5+
def __init__(self, name):
6+
self.name = name
7+
8+
9+
class DirectedGraph:
10+
11+
def __init__(self,size=20):
12+
self._adj = [ [0 for column in range(size)] for row in range(size) ]
13+
self._n = 0
14+
self._vertexList = []
15+
16+
17+
def display(self):
18+
for i in range(self._n):
19+
for j in range(self._n):
20+
print( self._adj[i][j], end =' ')
21+
print()
22+
23+
24+
def numVertices(self):
25+
return self._n
26+
27+
28+
def numEdges(self):
29+
e = 0
30+
for i in range(self._n):
31+
for j in range(self._n):
32+
if self._adj[i][j]!=0:
33+
e+=1
34+
return e
35+
36+
37+
def vertices(self):
38+
return [vertex.name for vertex in self._vertexList]
39+
40+
41+
def edges(self):
42+
edges = []
43+
for i in range(self._n):
44+
for j in range(self._n):
45+
if self._adj[i][j] != 0:
46+
edges.append( (self._vertexList[i].name, self._vertexList[j].name) )
47+
return edges
48+
49+
50+
def _getIndex(self,s):
51+
index = 0
52+
for name in (vertex.name for vertex in self._vertexList):
53+
if s == name:
54+
return index
55+
index += 1
56+
return None
57+
58+
59+
def insertVertex(self,name):
60+
if name in (vertex.name for vertex in self._vertexList): ########
61+
print("Vertex with this name already present in the graph")
62+
return
63+
64+
self._vertexList.append( Vertex(name) )
65+
self._n += 1
66+
67+
68+
def removeVertex(self,name):
69+
u = self._getIndex(name)
70+
if u is None:
71+
print("Vertex not present in the graph")
72+
return
73+
74+
self._adj.pop(u)
75+
76+
for i in range(self._n):
77+
self._adj[i].pop(u)
78+
79+
self._vertexList.pop(u)
80+
self._n -= 1
81+
82+
83+
def insertEdge(self, s1, s2):
84+
u = self._getIndex(s1)
85+
v = self._getIndex(s2)
86+
if u is None:
87+
print("Start vertex not present in the graph, first insert the start vertex")
88+
elif v is None:
89+
print("End vertex not present in the graph, first insert the end vertex")
90+
elif u == v:
91+
print("Not a valid edge")
92+
elif self._adj[u][v] != 0 :
93+
print("Edge already present in the graph")
94+
else:
95+
self._adj[u][v] = 1
96+
97+
98+
def removeEdge(self, s1,s2):
99+
u = self._getIndex(s1)
100+
v = self._getIndex(s2)
101+
if u is None:
102+
print("Start vertex not present in the graph")
103+
elif v is None:
104+
print("End vertex not present in the graph")
105+
elif self._adj[u][v] == 0:
106+
print("Edge not present in the graph")
107+
else:
108+
self._adj[u][v] = 0
109+
110+
111+
def isAdjacent(self, s1, s2):
112+
u = self._getIndex(s1)
113+
v = self._getIndex(s2)
114+
if u is None:
115+
print("Start vertex not present in the graph")
116+
return False
117+
elif v is None:
118+
print("End vertex not present in the graph")
119+
return False
120+
return False if self._adj[u][v] == 0 else True
121+
122+
123+
def outdegree(self, s):
124+
u = self._getIndex(s)
125+
if u is None:
126+
print("Vertex not present in the graph")
127+
return
128+
129+
outd = 0
130+
for v in range(self._n):
131+
if self._adj[u][v] != 0 :
132+
outd+=1
133+
return outd
134+
135+
136+
def indegree(self, s):
137+
u = self._getIndex(s)
138+
if u is None:
139+
print("Vertex not present in the graph")
140+
return
141+
142+
ind = 0
143+
144+
for v in range(self._n):
145+
if self._adj[v][u] != 0 :
146+
ind+=1
147+
return ind
148+
149+
150+
def warshalls(self):
151+
152+
p = [ [0 for column in range(self._n)] for row in range(self._n) ]
153+
154+
for i in range(self._n):
155+
for j in range(self._n):
156+
p[i][j] = self._adj[i][j]
157+
158+
for k in range(self._n):
159+
for i in range(self._n):
160+
for j in range(self._n):
161+
p[i][j] = p[i][j] or ( p[i][k] and p[k][j] )
162+
163+
164+
for i in range(self._n):
165+
for j in range(self._n):
166+
if p[i][j] != 0:
167+
print("1", end =" ")
168+
else:
169+
print("0", end =" ")
170+
print()
171+
print()
172+
173+
174+
if __name__ == '__main__':
175+
176+
g1 = DirectedGraph()
177+
178+
g1.insertVertex("Zero")
179+
g1.insertVertex("One")
180+
g1.insertVertex("Two")
181+
g1.insertVertex("Three")
182+
183+
g1.insertEdge("Zero", "One")
184+
g1.insertEdge("Zero", "Three")
185+
g1.insertEdge("One", "Two")
186+
g1.insertEdge("Two", "One")
187+
g1.insertEdge("Three", "Zero")
188+
g1.insertEdge("Three", "Two")
189+
190+
g1.warshalls()
191+
192+

0 commit comments

Comments
(0)

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