Skip to content

Commit 6b4bd20

Browse files
committed
Graph problems
- Kruskals algorithm - Cycle in a graph
1 parent df0c42d commit 6b4bd20

3 files changed

Lines changed: 133 additions & 1 deletion

File tree

graph/cycle.py

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
# detect cycle in an undirected graph
2+
from collections import defaultdict
3+
4+
5+
class Graph(object):
6+
def __init__(self, v):
7+
self.vertices = v
8+
self.graph = defaultdict(list)
9+
10+
def addEdge(self, u, v):
11+
self.graph[u].append(v)
12+
13+
def get_parent(self, parent, i):
14+
if parent[i] == -1:
15+
return i
16+
# else fetch top level parent
17+
return self.get_parent(parent, parent[i])
18+
19+
# establish a parent child relationship between u,v if there does not
20+
# exists any
21+
def union(self, parent, x, y):
22+
x_p = self.get_parent(parent, x)
23+
y_p = self.get_parent(parent, y)
24+
parent[x_p] = y_p
25+
26+
def has_cycle(self):
27+
parent = [-1]*self.vertices
28+
for i in self.graph:
29+
for j in self.graph[i]:
30+
x = self.get_parent(parent, i)
31+
y = self.get_parent(parent, j)
32+
if x == y:
33+
return True
34+
else:
35+
self.union(parent, x, y)
36+
return False
37+
38+
39+
if __name__ == '__main__':
40+
g = Graph(3)
41+
g.addEdge(0, 1)
42+
g.addEdge(0, 2)
43+
g.addEdge(2, 1)
44+
45+
cycle = g.has_cycle()
46+
if cycle:
47+
print "Cyclic"
48+
else:
49+
print "Acyclic"

graph/dfs.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,15 @@ def dfs(v):
3030
stack.append(i)
3131

3232

33+
def dfs_recursion(v):
34+
v.visited = True
35+
print v.data,
36+
for i in v.next_vertex:
37+
# print "==", i.data, i.visited
38+
if not i.visited:
39+
dfs_recursion(i)
40+
41+
3342
if __name__ == '__main__':
3443
v0 = Vertex(10)
3544
v1 = Vertex(11)
@@ -42,4 +51,7 @@ def dfs(v):
4251
v2.next_vertex = v3
4352
v3.next_vertex = v3
4453

45-
dfs(v2)
54+
# dfs(v2)
55+
print ""
56+
# Comment either call before running.
57+
dfs_recursion(v2)

graph/kruskalsMST.py

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
class Graph(object):
2+
def __init__(self, v):
3+
self.vertices = v
4+
self.graph = []
5+
6+
def add_edge(self, u, v, weight):
7+
self.graph.append([u, v, weight])
8+
9+
def get_parent(self, parent, i):
10+
if parent[i] == i:
11+
return i
12+
return self.get_parent(parent, parent[i])
13+
14+
# establish parent child relation if not exists
15+
def union(self, parent, x, y):
16+
x_p = self.get_parent(parent, x)
17+
y_p = self.get_parent(parent, y)
18+
parent[x_p] = y_p
19+
20+
def kruskals(self):
21+
mst = []
22+
parent = []
23+
for i in range(self.vertices):
24+
parent.append(i)
25+
self.graph = sorted(self.graph, key=lambda item: item[2])
26+
e = 0
27+
i = 0
28+
while e < self.vertices - 1:
29+
u, v, w = self.graph[i]
30+
i += 1
31+
x = self.get_parent(parent, u)
32+
y = self.get_parent(parent, v)
33+
# if this edge is not part of mst add it and increase used
34+
# edge count and also establish a parent child relation between u,v
35+
if x != y:
36+
e += 1
37+
mst.append([u, v, w])
38+
self.union(parent, x, y)
39+
else:
40+
# don't do anything as this u,v is already in mast
41+
pass
42+
return mst
43+
44+
45+
if __name__ == '__main__':
46+
g = Graph(9)
47+
g.add_edge(0, 1, 4)
48+
g.add_edge(1, 2, 8)
49+
g.add_edge(1, 7, 11)
50+
g.add_edge(2, 3, 7)
51+
g.add_edge(2, 8, 2)
52+
g.add_edge(2, 5, 4)
53+
g.add_edge(3, 4, 9)
54+
g.add_edge(3, 5, 14)
55+
g.add_edge(4, 5, 10)
56+
g.add_edge(5, 6, 2)
57+
g.add_edge(6, 7, 1)
58+
g.add_edge(6, 8, 6)
59+
g.add_edge(7, 0, 8)
60+
g.add_edge(7, 8, 7)
61+
62+
# g = Graph(4)
63+
# g.add_edge(0, 1, 10)
64+
# g.add_edge(0, 2, 6)
65+
# g.add_edge(0, 3, 5)
66+
# g.add_edge(1, 3, 15)
67+
# g.add_edge(2, 3, 4)
68+
69+
mst = g.kruskals()
70+
for u, v, weight in mst:
71+
print u, "-->", v, "==", weight

0 commit comments

Comments
 (0)