Cod sursa(job #2289207)

Utilizator q1e123Solca Robert-Nicolae q1e123 Data 24 noiembrie 2018 11:55:05
Problema Paduri de multimi disjuncte Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.94 kb
#include <cstdio>

const int MAX = 100001;
int n,m,tati[MAX],rang[MAX];

int find(int x){
    int node;
    node = x;
    while(tati[node]!=node) node=tati[node];
    int y;
    while(tati[x]!=x){
        y=tati[x];
        tati[y]=node;
        x=y;
    }
    return node;
}

void unite(int x,int y){
    if(rang[x]<rang[y]) tati[x]=y;
    else tati[y]=x;
    if(rang[x]==rang[y]) ++rang[y];

}

int main() {
    freopen("disjoint.in","r",stdin);
    freopen("disjoint.out","w",stdout);

    scanf("%d %d",&n,&m);

    for(int i=0;i<n;++i){
        tati[i]=i;
        rang[i]=1;
    }

    for(int i=0;i<m;++i){
        int cerinta, x,y;
        scanf("%d %d %d",&cerinta,&x,&y);
        if(cerinta==1){
            if (find(x) == find(y))	 {fprintf(stderr,"%d ", i);return 0;}
            unite(x,y);
        }else{
            if(find(x)==find(y)){
                printf("DA\n");
            }
            else printf("NU\n");
        }
    }

    return 0;
}