Skip to content

Instantly share code, notes, and snippets.

@SammyHerring
Created October 19, 2017 12:59
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save SammyHerring/1e18563dc3b0d36ec5d41fa473e94b06 to your computer and use it in GitHub Desktop.
Save SammyHerring/1e18563dc3b0d36ec5d41fa473e94b06 to your computer and use it in GitHub Desktop.
Kruskal's Algorithm to find minimum spanning tree.
parent = dict()
rank = dict()
def make_set(vertice):
parent[vertice] = vertice
rank[vertice] = 0
def find(vertice):
if parent[vertice] != vertice:
parent[vertice] = find(parent[vertice])
return parent[vertice]
def union(vertice1, vertice2):
root1 = find(vertice1)
root2 = find(vertice2)
if root1 != root2:
if rank[root1] > rank[root2]:
parent[root2] = root1
else:
parent[root1] = root2
if rank[root1] == rank[root2]: rank[root2] += 1
def kruskal(graph):
for vertice in graph['vertices']:
make_set(vertice)
minimum_spanning_tree = set()
edges = list(graph['edges'])
edges.sort()
for edge in edges:
weight, vertice1, vertice2 = edge
if find(vertice1) != find(vertice2):
union(vertice1, vertice2)
minimum_spanning_tree.add(edge)
return minimum_spanning_tree
graph = {
'vertices': ['A', 'B', 'C', 'D', 'E', 'F'],
'edges': set([
(1, 'A', 'B'),
(5, 'A', 'C'),
(3, 'A', 'D'),
(4, 'B', 'C'),
(2, 'B', 'D'),
(1, 'C', 'D'),
])
}
minimum_spanning_tree = set([
(1, 'A', 'B'),
(2, 'B', 'D'),
(1, 'C', 'D'),
])
assert kruskal(graph) == minimum_spanning_tree
print(kruskal(graph))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment