Cod sursa(job #1024257)

Utilizator macajouMaca George macajou Data 8 noiembrie 2013 14:55:02
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include <cstdio>
#include <cstring>

using namespace std;

int tata[100001],h[100001],n,m;

int radacina(int x)
{
    int rx=x;
    while(tata[rx]!=rx)
          rx=tata[rx];
    int y=x;
    while(tata[y]!=y)
          {
              int aux=tata[y];
              tata[y]=rx;
              y=aux;
          }
    return rx;
}

void reuniune(int x, int y)
{
    int rx=radacina(x),ry=radacina(y);
    if(rx!=ry)
       {
           if(h[rx]<h[ry])
             tata[rx]=ry;
           else
               {
                   tata[ry]=rx;
                   if(h[rx]==h[ry])
                      h[rx]++;
               }
       }
}

void rez()
{
    int i,op,x,y;
    for(i=1;i<=m;i++)
        {
            scanf("%d%d%d",&op,&x,&y);
            if(op==1)
               reuniune(x,y);
            else
                {
                    if(radacina(x)==radacina(y))
                       printf("DA\n");
                    else printf("NU\n");
                }
        }
}

int main()
{

   freopen("disjoint.in","r",stdin);
   freopen("disjoint.out","w",stdout);

    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
        {
            tata[i]=i;
            h[i]=0;
        }
    rez();

    return 0;
}