Cod sursa(job #2414890)

Utilizator teodor.dumitrescuDumitrescu Teodor teodor.dumitrescu Data 25 aprilie 2019 11:37:28
Problema Paduri de multimi disjuncte Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.3 kb
#include <iostream>
#include <fstream>

using namespace std;
const int NMAX=100005;
int tata[NMAX];
int h[NMAX];
int find_father(int x)
{
    /*if(x==tata[x])
        return x;
    return find_father(tata[x]);
    tata[x]=tata[tata[x]];*/
    int t=x;
    int aux;
    while(tata[t]!=t)
        t=tata[t];
    while(tata[x]!=t)
    {
        aux=tata[x];
        tata[x]=t;
        x=aux;
    }
    return t;
}
void reunite(int x, int y)
{
    if(h[x]>=h[y])
    {
        tata[y]=x;
        h[x]++;
    }
    else
    {
        tata[x]=y;
        h[y]++;
    }
}
int main()
{
    ifstream in("disjoint.in");
    ofstream out("disjoint.out");
    int N,M,i,op,x,y,t1,t2;
    in>>N>>M;
    for(i=1;i<=N;i++)
    {
        tata[i]=i;
        h[i]=1;
    }
    for(i=1;i<=M;i++)
    {
        in>>op>>x>>y;
        switch(op)
        {
            case 1:
            {
                t1=find_father(x);
                t2=find_father(y);
                reunite(t1,t2);
            }
                break;
            case 2:
            {
                if(find_father(x)==find_father(y))
                    out<<"DA"<<endl;
                else
                    out<<"NU"<<endl;
            }
                break;
        }
    }
    return 0;
}