Cod sursa(job #2944122)

Utilizator avethegamerAveTheGamer avethegamer Data 22 noiembrie 2022 01:36:31
Problema Paduri de multimi disjuncte Scor 0
Compilator py Status done
Runda Arhiva educationala Marime 1.04 kb
from typing import List


def find(nod: int, parinte: List[int]) -> int:
    # aflam multimea in care se afla elementul "nod"
    if parinte[nod] == nod:
        return nod
    parinte[nod] = find(parinte[nod], parinte)
    return parinte[nod]


def union(x: int, y: int, parinte: List[int], rang: List[int]) -> None:
    # unesc multimea cu rang mai mic de cea cu rang mai mare
    if rang[x] > rang[y]:
        parinte[y] = x
        rang[x] += rang[y]
    else:
        parinte[x] = y
        rang[y] += rang[x]


with open("disjoint.in") as f, open("disjoint.out", 'w') as g:
    n, m = map(int, f.readline().split())
    parinte = [i for i in range(n + 1)]
    rang = [1] * (n + 1)
    for i in range(n):
        while m:
            tip, x, y = map(int, f.readline().split())
            if tip == 1:
                union(find(x, parinte), find(y, parinte), parinte, rang)
            else:
                if find(x, parinte) == find(y, parinte):
                    g.write("DA\n")
                else:
                    g.write("NU\n")
            m -= 1