Cod sursa(job #1768601)

Utilizator stelian2000Stelian Chichirim stelian2000 Data 1 octombrie 2016 11:29:21
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.99 kb
#include <cstdio>

using namespace std;

int rad[100010],v[100010];

int radacina(int x,int c)
{
    int y=x;
    while(rad[y]!=y) y=rad[y];
    while(x!=y)
    {
        v[x]=c;
        int aux=rad[x];
        rad[x]=y;
        x=aux;
    }
    return y;
}

void reuneste(int x,int y)
{
    int a=radacina(y,v[x]+v[y]),b=radacina(x,v[x]+v[y]);
    rad[b]=a;
}

int query(int x,int y)
{
    if(radacina(x,v[x]+v[y])==radacina(y,v[x]+v[y])) return 1;
    else return 0;
}

int main()
{
    freopen("disjoint.in","r",stdin);
    freopen("disjoint.out","w",stdout);
    int n,m,x,y,cod;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
    {
        rad[i]=i;
        v[i]=1;
    }
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d%d",&cod,&x,&y);
        if(cod==1)
            if(v[x]<v[y]) reuneste(x,y);
            else reuneste(y,x);
        if(cod==2)
            if(query(x,y)==1) printf("DA\n");
            else printf("NU\n");
    }
    return 0;
}