Cod sursa(job #2231604)

Utilizator danielsociuSociu Daniel danielsociu Data 15 august 2018 08:23:25
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 kb
#include <fstream>
#include <vector>
std::ifstream cin("disjoint.in");
std::ofstream cout("disjoint.out");
#define maxn 100050
int TT[maxn],R[maxn];

int findg(int x){
    int R,y;
    for(R=x;TT[R]!=R;R=TT[R]);

    for(;TT[x]!=x;)//In caz daca au fost unite 2 grp
    {               //drumul de la x catre r se va
        y=TT[x];    //reorienta in jurul radacinii
        TT[x]=R;
        x=y;
    }

    return R;
}
void unite(int x,int y){
    if(R[x]>R[y])
        TT[y]=x;
    else
        TT[x]=y;
    if(R[x]==R[y])
        R[y]++; //Daca rangurile erau egale
} //Voi creste rang ul lui y, pt ca s a folosit a 2a atribuire

int main()
{
    int n,m,op,x,y;
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        TT[i]=i;
        R[i]=1;
    }
    for(;m--;){
        cin>>op>>x>>y;
        if(op==1) //fctia findg ne asigura orientarea in jurul radacinii a nodurilor
            unite(findg(x),findg(y));
        else{
            if(findg(x)==findg(y))
                cout<<"DA\n";
            else
                cout<<"NU\n";
        }

    }
}