-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathKruskal.py
More file actions
63 lines (49 loc) · 1.51 KB
/
Copy pathKruskal.py
File metadata and controls
63 lines (49 loc) · 1.51 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
'''
Kruskal's Algorith for the MST.
Union find searches for cycles
11 4 2013
'''
import queue
q=queue.PriorityQueue()
parent = dict()
rank = dict()
def make_set(vertice):
parent[vertice], rank[vertice] = vertice, 0
def find(vertice):
if parent[vertice] != vertice:
parent[vertice] = find(parent[vertice])
return parent[vertice]
def union(vertice1, vertice2):
root1, root2= find(vertice1), 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()
for edge in list(graph['edges']): q.put(edge)
edges=[q.get() for edge in range(len(list(graph['edges'])))]
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'),
])}
print(kruskal(graph))
'''
minimum_spanning_tree = set([
(1, 'A', 'B'),
(2, 'B', 'D'),
(1, 'C', 'D'),
])
assert kruskal(graph) == minimum_spanning_tree
'''