Cod sursa(job #1396283)

Utilizator sergiunascaSergiu Nasca sergiunasca Data 22 martie 2015 13:22:01
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.01 kb
#include <stdio.h>
#include <vector>
using namespace std;
std::vector< int > tata,h;
int n,q,x,a,b,Ra,Rb;

void Union_R(int x0,int y0)
{
    if(h[x0]>h[y0])tata[y0] = x0;
    else if(h[x0]<h[y0])tata[x0] = y0;
    else
    {
        ++h[x0];
        tata[y0] = x0;
    }
}

int Find_R(int x0)
{
    int rad = x0,aux;
    while(tata[rad]!=rad)rad = tata[rad];
    while(tata[x0]!=rad)
    {
        aux = tata[x0];
        tata[x0] = rad;
        x0 = aux;
    }
    return rad;
}

int main()
{
    freopen("disjoint.in","r",stdin);
    freopen("disjoint.out","w",stdout);
    scanf("%d %d",&n,&q);
    tata.resize(n+1);
    h.resize(n+1);
    for(int i=1;i<=n;++i)tata[i] = i;
    for(int i=1;i<=q;++i)
    {
        scanf("%d %d %d",&x,&a,&b);
        Ra = Find_R(a);
        Rb = Find_R(b);
        if(x==1)
        {
            Union_R(Ra,Rb);
        }
        else
        {
            if(Ra==Rb)printf("DA\n");
            else printf("NU\n");
        }
    }
    return 0;
}