Cod sursa(job #424939)

Utilizator dead_knightTitei Paul Adrian dead_knight Data 25 martie 2010 12:48:45
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
#include<cstdio>
#include<iostream>
#include<fstream>
#include<vector>
#include<set>
#include<algorithm>
#include<cmath>

#define maxn 100004
#define maxm 100004
#define pb push_back
#define lb lower_bound
#define ub upper_bound
#define INFI 2147483640
#define t tata
using namespace std;

int n, h[maxn], tata[maxn];

int radacina(int x)
{
    int y=x, tmp;
    while(t[x])
        x=t[x];
    while(t[y])
        tmp=t[y], t[y]=x, y=tmp;
    return x;
}

int verifica(int x, int y){
    return radacina(x)==radacina(y);
}

void uneste(int x, int y)
{
    int rx=radacina(x), ry=radacina(y);
    if(h[rx]>h[ry])
        t[ry]=rx;
    else if(h[ry]>h[rx])
        t[rx]=ry;
    else
        t[rx]=ry, h[ry]++;
}

int main()
{
    int i, m, op, j;
    freopen("disjoint.out","w",stdout);
    ifstream fin("disjoint.in");
    fin>>n>>m;
    while(m--)
    {
        fin>>op>>i>>j;
        if(op==1)
            uneste(i,j);
        else
            if(verifica(i,j)==1)
                printf("DA\n");
            else
                printf("NU\n");
    }
    return 0;
}