Cod sursa(job #526585)

Utilizator BlaugranasEnal Gemaledin Blaugranas Data 28 ianuarie 2011 18:33:56
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.9 kb
#include<stdio.h>
#define N 100001
long n,m,y,z,i,p[N],r[N];
int x;

void init(long p[N],long r[N],long n)
{long i;
for(i=1;i<=n;i++)
     {p[i]=i;
     r[i]=0;}}
     
long find(long p[N],long i)
{if(p[i]==i)
      return i;
p[i]=find(p,p[i]);
return p[i];}

void unif(long p[N],long r[N],long i,long j)
{long ci,cj;
ci=find(p,i);
cj=find(p,j);
if(r[ci]>r[cj])
      p[cj]=ci;
else
      if(ci!=cj)
            {p[ci]=cj;
            if(r[ci]==r[cj])
                  r[cj]++;}}

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