Skip to content

Instantly share code, notes, and snippets.

@DanielNill
Last active June 25, 2019 02:44
Show Gist options
  • Select an option

  • Save DanielNill/bd564a2cb71d87d6fb368b7067aa35b1 to your computer and use it in GitHub Desktop.

Select an option

Save DanielNill/bd564a2cb71d87d6fb368b7067aa35b1 to your computer and use it in GitHub Desktop.
class Graph(object):
# g = [[vertex_1, vertex_2, weight]]
# vertices = # of vertices in graph
def __init__(self, vertices, g):
self.g = g
self.vertices = vertices
def kruskal_mst(self):
result = []
self.g = sorted(self.g, key=lambda item: item[2])
parent = []
rank = []
for node in range(self.vertices):
parent.append(node)
rank.append(0)
sorted_edges = 0
edges_taken = 0
while edges_taken < self.vertices - 1:
u, v, w = self.g[sorted_edges]
sorted_edges += 1
v1 = self.find(parent, u)
v2 = self.find(parent, v)
# does not form a cycle
if v1 != v2:
edges_taken += 1
result.append([u,v,w])
self.union(parent, rank, v1, v2)
return result
def find(self, parent, vertex):
if parent[vertex] == vertex:
return vertex
return self.find(parent, parent[vertex])
def union(self, parent, rank, v1, v2):
v1_root = self.find(parent, v1)
v2_root = self.find(parent, v2)
if rank[v1_root] < rank[v2_root]:
parent[v1_root] = v2_root
elif rank[v1_root] > rank[v2_root]:
parent[v2_root] = v1_root
else:
parent[v2_root] = v1_root
rank[v1_root] += 1
g = Graph(4, [[0, 1, 10], [0, 2, 6], [0, 3, 5], [1, 3, 15], [2, 3, 4]])
# [[2, 3, 4], [0, 3, 5], [0, 1, 10]]
print(g.kruskal_mst())
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment