def kruskal(graph): """ Use union-find """ all_edges = [] for start in graph: for tail in graph[start]: all_edges.append(Edge(graph[start][tail], start, tail)) sorted_edges = sorted(all_edges) dsu = DSU(len(graph) + 1) result = [] for edge in sorted_edges: if dsu.find_set(edge.start) != dsu.find_set(edge.end): dsu.union_sets(edge.start, edge.end) result.append(edge) print(result)
def clustering(graph, k): """ Use union-find """ all_edges = [] for start in graph: for tail in graph[start]: all_edges.append(Edge(graph[start][tail], start, tail)) sorted_edges = sorted(all_edges) dsu = DSU(len(graph) + 1) result = [] num_clusters = len(graph) for edge in sorted_edges: if dsu.find_set(edge.start) != dsu.find_set(edge.end): if num_clusters == k: print(edge) return dsu.union_sets(edge.start, edge.end) result.append(edge) num_clusters -= 1