Cod sursa(job #2493600)

Utilizator victorzarzuZarzu Victor victorzarzu Data 16 noiembrie 2019 15:56:07
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.95 kb
#include <bits/stdc++.h>

using namespace std;
int n,m,cerinta,x,y;
ifstream f("disjoint.in");
ofstream g("disjoint.out");
int TT[100001],RG[100001];

int found(int x)
{
    int R,y;

    for(R = x ; TT[R] != R ; R = TT[R]);

    while(TT[x] != x)
    {
        y = TT[x];
        TT[x] = R;
        x = y;
    }

    return R;
}

void unite(int x,int y)
{
    if(RG[x] > RG[y])
        TT[y] = x;
    else TT[x] = y;

    if(RG[x] == RG[y]) ++RG[y];
}

int main()
{
    f>>n>>m;
    for(int i=1;i<=n;++i)
    {
        TT[i] = i;
        RG[i] = 1;
    }
    for(int i=1;i<=m;++i)
    {
        f>>cerinta>>x>>y;
        if(cerinta==2)
        {
            if(found(x)==found(y))
                g<<"DA"<<'\n';
            else g<<"NU"<<'\n';
        }
        else
        {
            if(found(x)==found(y))
                continue;
            unite(found(x),found(y));
        }
    }
    return 0;
}