Cod sursa(job #228660)

Utilizator RobybrasovRobert Hangu Robybrasov Data 7 decembrie 2008 18:35:26
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
//paduri de multimi disjuncte
#include <cstdio>
#define N 100010
#define reuneste(a,b) uneste(gaseste(a),gaseste(b))

int P[N],rang[N],n,i,m,nr,a,b;

int gaseste(int x)
{
    /*
        se gaseste multimea in care se afla numarul x
        urcand in arbore pana la radacina (adica x==P[x])
    */
    if (x!=P[x]) P[x]=gaseste(P[x]);
    return P[x];
}

void uneste(int x, int y)
{
    /*
        se uneste mulimea in care se afla x cu cea in care se afla y,
        folosind reuniunea dupa rang, adica radacina arborelui
        mai mic este legata de cea a arborelui mai mare.
        daca rangurile sunt egale, se incrementeaza arbitrar unul dintre ei.
    */
    if (rang[x]<rang[y]) P[x]=y;
    else
    {
        P[y]=x;
        if (rang[x]==rang[y]) rang[x]++;
    }
}

int main()
{
    freopen("disjoint.in","r",stdin);
    freopen("disjoint.out","w",stdout);
    scanf("%d %d",&n,&m);
    for (i=0; i<=n; i++) P[i]=i;
    for (i=1; i<=m; i++)
    {   //1 - reuneste, 2 - query
        scanf("%d %d %d",&nr,&a,&b);
        if (nr==1) reuneste(a,b);
        else
            if (gaseste(a)==gaseste(b)) printf("DA\n");
            else printf("NU\n");
    }

    return 0;
}