Cod sursa(job #2124914)

Utilizator DanizisSpartanulDani Mocanu DanizisSpartanul Data 7 februarie 2018 18:28:43
Problema Paduri de multimi disjuncte Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 0.94 kb
#include <bits/stdc++.h>

using namespace std;

constexpr int NMax=100005;

ifstream fin("disjoint.in");
ofstream fout("disjoint.out");

int N,M;
int father[NMax],state[NMax];

int GetRoot(int root)
{
    for(;root!=father[root];root=father[root]);
    return root;
}

void Unite(int x,int y)
{
    if(state[x]>state[y])
        father[y]=x;
    else
        father[x]=y;
    if(state[x]==state[y])
        state[y]++;
}

int main()
{
    fin>>N>>M;

    for(int i=1;i<=N;i++)
        father[i]=state[i]=i;

    for(int i=1;i<=M;i++)
    {
        int op,x,y;
        fin>>op>>x>>y;
        if(op==1)
        {
            int rootx=GetRoot(x);
            int rooty=GetRoot(y);
            Unite(rootx,rooty);
        }
        if(op==2)
        {
            int rootx=GetRoot(x);
            int rooty=GetRoot(y);
            rootx==rooty ? fout<<"DA\n" : fout<<"NU\n";
        }
    }

    return 0;
}