Cod sursa(job #526574)

Utilizator BlaugranasEnal Gemaledin Blaugranas Data 28 ianuarie 2011 18:10:36
Problema Paduri de multimi disjuncte Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 0.9 kb
#include<stdio.h>
#define N 100001
typedef struct
{long p[N],k;}ds;
long n,m,y,z,i;
int x;
ds c;

void init(ds &c,long n)
{long i;
c.k=n;
for(i=1;i<=n;i++)
     c.p[i]=-1;}
     
long find(ds c,long x)
{if(c.p[x]<0)
      return x;
return c.p[x]=find(c,c.p[x]);}

void unif(ds &c,long x,long y)
{long cx,cy;
cx=find(c,x);
cy=find(c,y);
if(cx==cy)
       return;
if(c.p[cx]<=c.p[cy])
       {c.p[cx]+=c.p[cy];
       c.p[cy]=cx;}
else
       {c.p[cy]+=c.p[cx];
       c.p[cx]=cy;}}

int main()
{freopen("disjoint.in","r",stdin);
freopen("disjoint.out","w",stdout);
scanf("%ld%ld\n",&n,&m);
init(c,n);
for(i=0;i<m;i++)
     {scanf("%d%ld%ld\n",&x,&y,&z);
     if(x==1)
             unif(c,y,z);
     else
             if(find(c,y)==find(c,z))
                    printf("DA\n");
             else
                    printf("NU\n");}
fclose(stdin);
fclose(stdout);
return 0;}