Пример #1
0
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)
Пример #2
0
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