Cod sursa(job #634036)

Utilizator blk.irineluIrina Ursateanu blk.irinelu Data 15 noiembrie 2011 15:16:58
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.99 kb
#include <fstream>
#include <stdio.h>

using namespace std;

const int maxn = 100005;

int n,m,tata[maxn],niv[maxn],rx,ry;

int radacina(int x)
{
    int aux,c=0,rad;
    aux=x;
    while(aux!=tata[aux])
    {
          aux=tata[aux];
          c++;
     }
     rad=aux;
     aux=x;
     while(aux!=tata[aux])
     {
         niv[aux]=c;
         tata[aux]=rad;
         aux=tata[aux];
     }
     return rad;
}

void unire(int x,int y)
{
     if(niv[x]>=niv[y])
       tata[ry]=rx;
     else
       tata[rx]=ry;
}

int main()
{
    int x,y,cod;
    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;

    for(;m;m--)
    {
            scanf("%d%d%d",&cod,&x,&y);
            rx=radacina(x);
            ry=radacina(y);

            if(cod==1) unire(x,y);
            else if(rx==ry) printf("DA\n");
                   else printf("NU\n");
    }
    return 0;
}