Cod sursa(job #1716135)

Utilizator PaulCbnCiobanu Paul PaulCbn Data 12 iunie 2016 00:03:01
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include <iostream>
#include <cstdio>
using namespace std;


int N,M;

struct nod
{
    nod *parent = this;
    int value;
    int rang = 0;
}*a[100005];

nod* find(nod *x)
{
    if(x->parent != x)
        x->parent = find(x->parent);
    return x->parent;
}

void reunion(nod *&a, nod *&b)
{
    nod *pa = find(a);
    nod *pb = find(b);

    if(pa->rang > pb->rang)
        pb->parent = pa;
    else if(pb->rang < pb->rang)
        pa->parent = pb;
    else
    {
        pb->parent = pa;
        pa->rang++;
    }
}



int main()
{
    freopen("disjoint.in","r",stdin);
    freopen("disjoint.out","w",stdout);
    scanf("%d%d",&N,&M);

    for(int i=1;i<=N;i++)
    {
        a[i] = new nod;
        a[i] -> value = i;
    }
    for(int i=1;i<=M;i++)
    {
        int t,x,y;
        scanf("%d%d%d",&t,&x,&y);
        if(t==1)
        {
            reunion(a[x],a[y]);
        }
        else
        {
            if(find(a[x])==find(a[y]))
                printf("DA");
            else
                printf("NU");
            printf("\n");
        }
    }

    return 0;
}