Cod sursa(job #2943665)

Utilizator avethegamerAveTheGamer avethegamer Data 21 noiembrie 2022 15:13:57
Problema Paduri de multimi disjuncte Scor 0
Compilator py Status done
Runda Arhiva educationala Marime 0.97 kb
from typing import List


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


def union(x: int, y: int):
    # 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: List[int] = [-1] * (n+1)
    rang: List[int] = [-1] * (n+1)
    for i in range(1, n+1):
        parinte[i] = i
        rang[i] = 1

        while m:
            tip, x, y = map(int, f.readline().split())
            if tip == 1:
                union(find(x), find(y))
            else:
                if find(x) == find(y):
                    g.write("DA\n")
                else:
                    g.write("NU\n")
            m -= 1