Skip to content

Commit 15a291d

Browse files
authored
Create g_kruskal.py
1 parent fde8400 commit 15a291d

File tree

1 file changed

+68
-0
lines changed

1 file changed

+68
-0
lines changed

g_kruskal.py

+68
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
# Kruskal's algorithm in Python
2+
3+
class Graph:
4+
def __init__(self, vertices):
5+
self.V = vertices
6+
self.graph = []
7+
8+
def add_edge(self, u, v, w):
9+
self.graph.append([u, v, w])
10+
11+
# Search function
12+
13+
def find(self, parent, i):
14+
if parent[i] == i:
15+
return i
16+
return self.find(parent, parent[i])
17+
18+
def apply_union(self, parent, rank, x, y):
19+
xroot = self.find(parent, x)
20+
yroot = self.find(parent, y)
21+
if rank[xroot] < rank[yroot]:
22+
parent[xroot] = yroot
23+
elif rank[xroot] > rank[yroot]:
24+
parent[yroot] = xroot
25+
else:
26+
parent[yroot] = xroot
27+
rank[xroot] += 1
28+
29+
# Applying Kruskal algorithm
30+
def kruskal_algo(self):
31+
result = []
32+
i, e = 0, 0
33+
self.graph = sorted(self.graph, key=lambda item: item[2])
34+
parent = []
35+
rank = []
36+
for node in range(self.V):
37+
parent.append(node)
38+
rank.append(0)
39+
while e < self.V - 1:
40+
u, v, w = self.graph[i]
41+
i = i + 1
42+
x = self.find(parent, u)
43+
y = self.find(parent, v)
44+
if x != y:
45+
e = e + 1
46+
result.append([u, v, w])
47+
self.apply_union(parent, rank, x, y)
48+
for u, v, weight in result:
49+
print("%d - %d: %d" % (u, v, weight))
50+
51+
52+
g = Graph(6)
53+
g.add_edge(0, 1, 4)
54+
g.add_edge(0, 2, 4)
55+
g.add_edge(1, 2, 2)
56+
g.add_edge(1, 0, 4)
57+
g.add_edge(2, 0, 4)
58+
g.add_edge(2, 1, 2)
59+
g.add_edge(2, 3, 3)
60+
g.add_edge(2, 5, 2)
61+
g.add_edge(2, 4, 4)
62+
g.add_edge(3, 2, 3)
63+
g.add_edge(3, 4, 3)
64+
g.add_edge(4, 2, 4)
65+
g.add_edge(4, 3, 3)
66+
g.add_edge(5, 2, 2)
67+
g.add_edge(5, 4, 3)
68+
g.kruskal_algo()

0 commit comments

Comments
 (0)