Cod sursa(job #228365)

Utilizator Pepelea_FlaviuFlaviu Pepelea Pepelea_Flaviu Data 6 decembrie 2008 23:59:07
Problema Paduri de multimi disjuncte Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
# include <stdio.h>

# define FIN "disjoint.in"
# define FOUT "disjoint.out"
# define MAXN 100005

int N, M, a, b, op, i;
int T[MAXN];
int H[MAXN];

     int tata(int nod)
     {
         while (T[nod])
           nod = T[nod];
         
         return nod;
     }
     
     void verif(int x, int y)
     {
         int f1, f2;
         
         f1 = tata(x);
         f2 = tata(y);
         
         if (f1 == f2)
           printf("DA\n");
         else
           printf("NU\n");
     }
     
     void uneste(int x, int y)
     {
         int f1, f2;
         
         f1 = tata(x);
         f2 = tata(y);
         
         if (f1 != f2)
           {
               if (H[f1] < H[f2])
                 T[x] = y;
               
               if (H[f1] > H[f2])
                 T[y] = x;
               
               if (H[f1] == H[f2])
                 {
                    T[x] = y;
                    H[f2]++;
                 }
           }
     }

     int main()
     {
         freopen(FIN,"r",stdin);
         freopen(FOUT,"w",stdout);
         
         scanf("%d %d",&N,&M);
         for (i = 1; i <= M; ++i)
           {
              scanf("%d%d%d",&op,&a,&b);
              
              if (op == 1)
                uneste(a, b);
              
              if (op == 2)
                verif(a, b);
           }
         
         return 0;
     }