Cod sursa(job #2574659)

Utilizator victorzarzuZarzu Victor victorzarzu Data 6 martie 2020 08:08:53
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.93 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;
}