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 cb5467c

Browse files
Depth first search in Python
1 parent 6094903 commit cb5467c

File tree

7 files changed

+1774
-0
lines changed

7 files changed

+1774
-0
lines changed
Lines changed: 267 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,267 @@
1+
# Copyright (C) Deepali Srivastava - All Rights Reserved
2+
# This code is part of DSA course available on CourseGalaxy.com
3+
4+
INITIAL = 0
5+
VISITED = 1
6+
FINISHED = 2
7+
8+
class Vertex:
9+
def __init__(self, name):
10+
self.name = name
11+
12+
13+
class UndirectedGraph:
14+
15+
hasCycle = False
16+
17+
def __init__(self,size=20):
18+
self._adj = [ [0 for column in range(size)] for row in range(size) ]
19+
self._n = 0
20+
self._vertexList = []
21+
22+
23+
def display(self):
24+
for i in range(self._n):
25+
for j in range(self._n):
26+
print( self._adj[i][j], end =' ')
27+
print()
28+
29+
30+
def numVertices(self):
31+
return self._n
32+
33+
34+
def numEdges(self):
35+
e = 0
36+
for i in range(self._n):
37+
for j in range(i):
38+
if self._adj[i][j]!=0:
39+
e+=1
40+
return e
41+
42+
43+
def vertices(self):
44+
return [vertex.name for vertex in self._vertexList]
45+
46+
47+
def edges(self):
48+
edges = []
49+
for i in range(self._n):
50+
for j in range(i):
51+
if self._adj[i][j] != 0:
52+
edges.append( (self._vertexList[i].name, self._vertexList[j].name) )
53+
return edges
54+
55+
56+
def _getIndex(self,s):
57+
index = 0
58+
for name in (vertex.name for vertex in self._vertexList):
59+
if s == name:
60+
return index
61+
index += 1
62+
return None
63+
64+
65+
def insertVertex(self,name):
66+
if name in (vertex.name for vertex in self._vertexList): ########
67+
print("Vertex with this name already present in the graph")
68+
return
69+
70+
self._vertexList.append( Vertex(name) )
71+
self._n += 1
72+
73+
74+
def removeVertex(self,name):
75+
u = self._getIndex(name)
76+
if u is None:
77+
print("Vertex not present in the graph")
78+
return
79+
80+
self._adj.pop(u)
81+
82+
for i in range(self._n):
83+
self._adj[i].pop(u)
84+
85+
for i,vertex in enumerate(self._vertexList):
86+
if name == vertex.name:
87+
self._vertexList.pop(i)
88+
self._n -= 1
89+
90+
91+
def insertEdge(self, s1, s2):
92+
u = self._getIndex(s1)
93+
v = self._getIndex(s2)
94+
if u is None:
95+
print("Start vertex not present in the graph, first insert the start vertex")
96+
elif v is None:
97+
print("End vertex not present in the graph, first insert the end vertex")
98+
elif u == v:
99+
print("Not a valid edge")
100+
elif self._adj[u][v] != 0 :
101+
print("Edge already present in the graph")
102+
else:
103+
self._adj[u][v] = 1
104+
self._adj[v][u] = 1
105+
106+
107+
def removeEdge(self, s1,s2):
108+
u = self._getIndex(s1)
109+
v = self._getIndex(s2)
110+
if u is None:
111+
print("Start vertex not present in the graph")
112+
elif v is None:
113+
print("End vertex not present in the graph")
114+
elif self._adj[u][v] == 0:
115+
print("Edge not present in the graph")
116+
else:
117+
self._adj[u][v] = 0
118+
self._adj[v][u] = 0
119+
120+
121+
def isAdjacent(self, s1, s2):
122+
u = self._getIndex(s1)
123+
v = self._getIndex(s2)
124+
if u is None:
125+
print("Start vertex not present in the graph")
126+
return False
127+
elif v is None:
128+
print("End vertex not present in the graph")
129+
return False
130+
return False if self._adj[u][v] == 0 else True
131+
132+
133+
def degree(self,s):
134+
135+
u = self._getIndex(s)
136+
if u is None:
137+
print("Vertex not present in the graph")
138+
return
139+
140+
deg = 0
141+
for v in range(self._n):
142+
if self._adj[u][v] != 0 :
143+
deg += 1
144+
return deg
145+
146+
def dfsTraversal(self):
147+
s = input("Enter starting vertex for Depth First Search : ")
148+
u = self._getIndex(s)
149+
if u is None:
150+
print("Vertex not present in the graph")
151+
return
152+
153+
for v in range(self._n):
154+
self._vertexList[v].state = INITIAL
155+
self._vertexList[v].predecessor = None
156+
157+
self._dfs( u )
158+
print()
159+
160+
161+
def _dfs(self,v):
162+
163+
self._vertexList[v].state = VISITED
164+
165+
for i in range(self._n):
166+
if self._adj[v][i]!=0 and self._vertexList[v].predecessor != i:
167+
if self._vertexList[i].state == INITIAL:
168+
self._vertexList[i].predecessor = v
169+
print("Tree edge - " , self._vertexList[v].name , "," , self._vertexList[i].name)
170+
self._dfs(i)
171+
elif self._vertexList[i].state == VISITED:
172+
print("Back edge - " , self._vertexList[v].name ,"," , self._vertexList[i].name)
173+
174+
self._vertexList[v].state = FINISHED
175+
176+
177+
def dfsTraversalAll(self):
178+
s = input("Enter starting vertex for Depth First Search : ")
179+
u = self._getIndex(s)
180+
if u is None:
181+
print("Vertex not present in the graph")
182+
return
183+
184+
for v in range(self._n):
185+
self._vertexList[v].state = INITIAL
186+
self._vertexList[v].predecessor = None
187+
188+
self._dfs(u)
189+
190+
for v in range(self._n):
191+
if self._vertexList[v].state == INITIAL:
192+
self._dfs(v)
193+
print()
194+
195+
def isCyclic(self):
196+
for v in range(self._n):
197+
self._vertexList[v].state = INITIAL
198+
199+
UndirectedGraph.hasCycle = False
200+
201+
for v in range(self._n):
202+
if self._vertexList[v].state == INITIAL:
203+
self._dfsC(v)
204+
return UndirectedGraph.hasCycle
205+
206+
207+
def _dfsC(self,v):
208+
209+
self._vertexList[v].state = VISITED
210+
211+
for i in range(self._n):
212+
if self._adj[v][i]!=0 and self._vertexList[v].predecessor != i:
213+
if self._vertexList[i].state == INITIAL:
214+
self._vertexList[i].predecessor = v
215+
self._dfsC(i)
216+
elif self._vertexList[i].state == VISITED:
217+
UndirectedGraph.hasCycle = True
218+
self._vertexList[v].state = FINISHED
219+
220+
221+
222+
if __name__ == '__main__':
223+
224+
g = UndirectedGraph()
225+
226+
227+
g.insertVertex("Zero")
228+
g.insertVertex("One")
229+
g.insertVertex("Two")
230+
g.insertVertex("Three")
231+
g.insertVertex("Four")
232+
g.insertVertex("Five")
233+
g.insertVertex("Six")
234+
g.insertVertex("Seven")
235+
g.insertVertex("Eight")
236+
g.insertVertex("Nine")
237+
g.insertVertex("Ten")
238+
g.insertVertex("Eleven")
239+
g.insertVertex("Twelve")
240+
g.insertVertex("Thirteen")
241+
g.insertVertex("Fourteen")
242+
243+
g.insertEdge("Zero","One")
244+
g.insertEdge("Zero","Three")
245+
g.insertEdge("One","Two")
246+
g.insertEdge("One","Three")
247+
g.insertEdge("One","Four")
248+
g.insertEdge("Three","Four")
249+
g.insertEdge("Five","Six")
250+
g.insertEdge("Five","Seven")
251+
g.insertEdge("Five","Eight")
252+
g.insertEdge("Seven","Eight")
253+
g.insertEdge("Nine","Ten")
254+
g.insertEdge("Nine","Eleven")
255+
g.insertEdge("Nine","Twelve")
256+
g.insertEdge("Nine","Thirteen")
257+
g.insertEdge("Ten","Twelve")
258+
g.insertEdge("Eleven","Thirteen")
259+
g.insertEdge("Eleven","Fourteen")
260+
261+
g.dfsTraversalAll()
262+
263+
if g.isCyclic():
264+
print("Graph is Cyclic")
265+
else:
266+
print("Graph is Acylic")
267+

0 commit comments

Comments
(0)

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