class Graph:
def __init__(self, vertices):
self.vertices = vertices
self.edges = []
def add_edge(self, src, dest, weight):
self.edges.append([src, dest, weight])
def find_set(self, parent, node):
if parent[node] == node:
return node
return self.find_set(parent, parent[node])
def union_sets(self, parent, rank, set1, set2):
root1 = self.find_set(parent, set1)
root2 = self.find_set(parent, set2)
if rank[root1] < rank[root2]:
parent[root1] = root2
elif rank[root1] > rank[root2]:
parent[root2] = root1
else:
parent[root2] = root1
rank[root1] += 1
def kruskal(self):
mst = []
self.edges = sorted(self.edges, key=lambda item: item[2])
parent = []
rank = []
for vertex in range(self.vertices):
parent.append(vertex)
rank.append(0)
edge_index = 0
while len(mst) < self.vertices - 1:
src, dest, weight = self.edges[edge_index]
edge_index += 1
set1 = self.find_set(parent, src)
set2 = self.find_set(parent, dest)
if set1 != set2:
mst.append([src, dest, weight])
self.union_sets(parent, rank, set1, set2)
return mst
# Example usage:
graph = Graph(4)
graph.add_edge(0, 1, 10)
graph.add_edge(0, 2, 6)
graph.add_edge(0, 3, 5)
graph.add_edge(1, 3, 15)
graph.add_edge(2, 3, 4)
minimum_spanning_tree = graph.kruskal()
print("Minimum Spanning Tree:", minimum_spanning_tree)