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))