Cod sursa(job #359864)

Utilizator xtremespeedzeal xtreme Data 28 octombrie 2009 16:03:15
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
#include <stdio.h>
#define nmax 100010

int N,M,RG[nmax],TT[nmax];       //reuniune dupa limitele superioare a rangului fiecarui multimi si compresia drumurilor

int root(int num)
    {int R,j;                          //compresia drurilor
     for(R=TT[num];R!=TT[R];R=TT[R]);
     for(;num!=TT[num];)
              {j=TT[num];TT[num]=R;num=j;}
     return R;
     }
void unite(int R1,int R2)
     {if(RG[R1]>RG[R2])  TT[R2]=R1;       //lim_de_rang_max(B,A)= A U B  ,unde A si B doua multimi ce trebuiesc reunite
      else               TT[R1]=R2;
      if(RG[R1]==RG[R2]) RG[R2]++;
      }
int main()
    {freopen("disjoint.in","r",stdin);    
     freopen("disjoint.out","w",stdout);
     int i,tip,x,y;
     scanf("%d %d",&N,&M);
     for(i=1;i<=N;i++)    {RG[i]=1;TT[i]=i;}    
     for(i=1;i<=M;i++)
           {scanf("%d %d %d",&tip,&x,&y);
            if(tip==2)    
                     {if(root(x)==root(y)) printf("DA\n");
                      else                 printf("NU\n");
                     }
            else      unite(root(x),root(y));
            }
     fclose(stdin);fclose(stdout);return 0;
     }