Cod sursa(job #649195)

Utilizator costyv87Vlad Costin costyv87 Data 15 decembrie 2011 16:40:55
Problema Paduri de multimi disjuncte Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 0.79 kb
#include <cstdio>
FILE *f,*g;
int r[100100],t[100100];
int m,n,i,c,x,y;

void unite(int x, int y) {

if (r[x]<r[y]) {
    t[x]=t[y];
    }
else
    t[y]=t[x];

if (r[x] == r[y]) r[x]++;
}

int rad(int x) {
int R, y;

for (R = x; t[R] != R; R = t[R]);

for (; t[x] != x;){
    y = t[x];
    t[x] = R;
    x = y;
    }


return R;
}

int main() {
f=fopen("disjoint.in","r");
g=fopen("disjoint.out","w");

fscanf(f,"%d%d",&n,&m);

for (i = 1; i <= n; i++)
    {
    t[i] = i;
    r[i] = 1;
    }

for (i=1;i<=m;i++) {
    fscanf(f,"%d%d%d",&c,&x,&y);

    if (c==1) {
        unite(x,y);
        }
    else {
        if (rad(x)==rad(y))
            fprintf(g,"DA\n");
        else
            fprintf(g,"NU\n");
        }

    }


fclose(g);
return 0;
}