Cod sursa(job #1955743)

Utilizator VicktorVictor Teodor Stoian Vicktor Data 6 aprilie 2017 10:37:04
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.94 kb
#include <fstream>
#include <cstdio>
#define NMAX 100005

using namespace std;

ofstream cout("disjoint.out");

int tata[NMAX],H[NMAX];
int n,m,i;

inline void Union(const int &x, const int &y){
    if(H[x]>H[y])
        tata[y]=x;
    else
        if(H[x]<=H[y])
            tata[x]=y;
}

inline int Find(const int &x){
    int rx,x2,aux;
    rx=x;
    x2=x;

    while(tata[rx]) rx=tata[rx];
    if(x!=rx)
    while(tata[x2]!=rx){
        aux=tata[x2];
        tata[x2]=rx;
        x2=aux;
    }
    return rx;
}

int main()
{
    int x,y,caz,rx,ry;
    FILE*fin=freopen("disjoint.in","r",stdin);
    scanf("%d%d",&n,&m);

    for(i=1;i<=m;i++){
        scanf("%d%d%d",&caz,&x,&y);
        rx=Find(x);
        ry=Find(y);
        if(caz==1) Union(rx,ry);
        else{
            if(rx==ry)
                cout<<"DA"<<'\n';
            else
                cout<<"NU\n";
        }
    }
    return 0;
}