Пример #1
0
    def clustering_1(input_file: str):
        lines = BasicFuncs.load_file_as_string(input_file).splitlines()
        num_of_nodes = int(lines[0])
        edges = []
        for line in lines[1:]:
            start, finish, cost = map(int, line.split(' '))
            edge = Edge(start, finish, cost)
            edges.append(edge)
        edges.sort(key=lambda edge: edge.cost)
        clusters = num_of_nodes
        union_find = UnionFind(num_of_nodes)
        for i, edge in enumerate(edges):
            a = edge.start - 1
            b = edge.end - 1
            if union_find.join_two_subsets(a, b):
                clusters -= 1

            if clusters <= 4:
                break
        # Compute the smallest maximum spacing
        min_max_spacing = float('inf')
        for edge in edges[i + 1:]:
            a = edge.start - 1
            b = edge.end - 1
            if not union_find.are_two_indicies_part_of_same_set(a, b):
                min_max_spacing = min(min_max_spacing, edge.cost)
        return min_max_spacing
    def kruskals_algorithm(edges_file: str):
        s = BasicFuncs.load_file_as_string(edges_file)
        lines = s.splitlines()
        first_line = lines[0]
        num_of_nodes, num_of_edges = map(int, first_line.split(' '))
        union_find = UnionFind(num_of_nodes)
        edges = []
        for line in lines[1:]:
            start, end, cost = map(int, line.split(' '))
            edge = Edge(start, end, cost)
            edges.append(edge)
        edges.sort(key=lambda x: x.cost)
        min_span_tree_cost = 0
        for edge in edges:
            a = edge.start - 1
            b = edge.end - 1
            if union_find.join_two_subsets(a, b):
                min_span_tree_cost += edge.cost

        return min_span_tree_cost