41 lines
864 B
Python
41 lines
864 B
Python
|
def kruskal(vs, es):
|
||
|
f = []
|
||
|
sets = [set(v) for v in vs]
|
||
|
|
||
|
find_set = lambda v: [x for x in sets if v in x][0]
|
||
|
|
||
|
def merge_sets_that_contains(u, v):
|
||
|
setv = find_set(v)
|
||
|
newsets = [x for x in sets if v not in x]
|
||
|
newsets = [setv.union(x) if u in x else x for x in newsets]
|
||
|
return newsets
|
||
|
|
||
|
sorted_es = [e for e,w in sorted(es, key=lambda e: e[1])]
|
||
|
|
||
|
for (u, v) in sorted_es:
|
||
|
if find_set(u) != find_set(v):
|
||
|
f += [(u, v)]
|
||
|
sets = merge_sets_that_contains(u,v)
|
||
|
|
||
|
return f
|
||
|
|
||
|
if __name__ == '__main__':
|
||
|
vs = [chr(i) for i in range(ord('a'), ord('h') + 1)]
|
||
|
es = [
|
||
|
(('a', 'b'), 1),
|
||
|
(('b', 'c'), 5),
|
||
|
(('c', 'd'), 3),
|
||
|
(('d', 'a'), 7),
|
||
|
|
||
|
(('e', 'f'), 2),
|
||
|
(('f', 'g'), 6),
|
||
|
(('g', 'h'), 8),
|
||
|
(('h', 'e'), 4),
|
||
|
|
||
|
(('b', 'f'), 10),
|
||
|
(('c', 'e'), 9),
|
||
|
(('d', 'h'), 11)
|
||
|
]
|
||
|
|
||
|
print(kruskal(vs,es))
|