Cod sursa(job #3183229)

Utilizator SpaceWaltuhDragos Radoi SpaceWaltuh Data 11 decembrie 2023 11:21:26
Problema Arbore partial de cost minim Scor 0
Compilator py Status done
Runda Arhiva educationala Marime 1.51 kb
class DisjointSet:
    def __init__(self, vertices):
        self.parent = {}
        self.rank = {}
        for v in range(1, vertices + 1):
            self.parent[v] = v
            self.rank[v] = 0

    def find(self, vertex):
        if self.parent[vertex] != vertex:
            self.parent[vertex] = self.find(self.parent[vertex])
        return self.parent[vertex]

    def union(self, vertex1, vertex2):
        root1 = self.find(vertex1)
        root2 = self.find(vertex2)

        if root1 != root2:
            if self.rank[root1] < self.rank[root2]:
                self.parent[root1] = root2
            elif self.rank[root1] > self.rank[root2]:
                self.parent[root2] = root1
            else:
                self.parent[root1] = root2
                self.rank[root2] += 1


def kruskal(vertices, edges):
    edges = sorted(edges, key=lambda x: x[2])
    result = []
    disjoint_set = DisjointSet(vertices)

    for edge in edges:
        u, v, weight = edge
        if disjoint_set.find(u) != disjoint_set.find(v):
            result.append(edge)
            disjoint_set.union(u, v)

    return result


def main():
    num_vertices, num_edges = map(int, input().split())
    edges = []

    for _ in range(num_edges):
        u, v, weight = map(int, input().split())
        edges.append((u, v, weight))

    minimum_spanning_tree = kruskal(num_vertices, edges)

    print("Edges in the Minimum Spanning Tree:")
    for edge in minimum_spanning_tree:
        print(edge)


if __name__ == "__main__":
    main()