Cod sursa(job #1360058)

Utilizator obidanDan Ganea obidan Data 25 februarie 2015 11:15:31
Problema Paduri de multimi disjuncte Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 0.96 kb
#include <iostream>
#include <cstdio>
using namespace std;

#define NMax 100002

int tata[NMax],rankit[NMax];

void Make_Set(int x)
{
    tata[x] = x;
    rankit[x] = 1;
}
void Union(int x, int y )
{
    if(rankit[x] < rankit[y])
    {
        tata[x] = y;
    }
    else if(rankit[x] > rankit[y])
    {
        tata[y] = x;
    }
    else
    {
        tata[x] = y;
        rankit[y]++;
    }
}
int Find(int x)
{
    if(tata[x] != x)
    {
        tata[x] = Find(tata[x]);
    }
    return tata[x];
}
int main()
{
    int n,m,x,y,op,i;
    freopen("disjoint.in","r",stdin);
    freopen("disjoint.out","w",stdout);
    scanf("%d %d",&n,&m);
    for(i = 1; i <= n; i++)
    {
        Make_Set(i);
    }

    for(i = 1; i <= m; i++)
    {
        cin>>op>>x>>y;
        if(op == 1)
            Union(Find(x),Find(y));
        else if(Find(x) == Find(y))
            cout<<"DA\n";
        else
            cout<<"NU\n";
    }
}