#! /usr/bin/env python
#coding:utf-8
"""
Kruskal
ABCD((1,'A','B'),(5,'A','C'),(3,'A','D'),(4,'B','C'),(2,'B','D'),(1,'C','D')
"""
#X{'A':'A','B':'B','C':'C','D':'D'},AB{'A':'B','B':'B",...},value
X = dict()
#0,1
R = dict()
#X R
def make_set(point):
X[point] = point
R[point] = 0
#
def find(point):
if X[point] != point:
X[point] = find(X[point])
return X[point]
#
def merge(point1,point2):
r1 = find(point1)
r2 = find(point2)
if r1 != r2:
if R[r1] > R[r2]:
X[r2] = r1
else:
X[r1] = r2
if R[r1] == R[r2]: R[r2] += 1
#KRUSKAL
def kruskal(graph):
for vertice in graph['vertices']:
make_set(vertice)
minu_tree = set()
edges = list(graph['edges'])
edges.sort() #
for edge in edges:
weight, vertice1, vertice2 = edge
if find(vertice1) != find(vertice2):
merge(vertice1, vertice2)
minu_tree.add(edge)
return minu_tree
if __name__=="__main__":
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'),
])
}
result = kruskal(graph)
print result
"""
:
1.https://github.com/qiwsir/Algorithms-Book--Python/blob/master/5-Greedy-algorithms/kruskal.py
2.(GILLES Brassard,Paul Bratley)
"""