Cod sursa(job #1233890)

Utilizator ConstantinPetroviciPetrovici Constantin ConstantinPetrovici Data 26 septembrie 2014 11:40:39
Problema Paduri de multimi disjuncte Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
#include <iostream>
#include <cstdio>

using namespace std;

const int MAX=1000007;
int n,tata[MAX],nod[MAX];

int findtata(int x)
{
    if (x==tata[x])
        return x;
    int t=findtata(tata[x]);
    tata[x]=t;
    return t;
}
bool sameset(int a,int b)
{
    return findtata(a)==findtata(b);
}
void reuniune(int a,int b)
{
    int ta=findtata(a),tb=findtata(b);
    if (nod[tb]>nod[ta])
        {
            nod[tb]=nod[tb]+nod[ta];
            tata[ta]=tb;
        }
    else
    {
        nod[ta]=nod[ta]+nod[tb];
        tata[tb]=ta;

    }
}
int main()
{
    freopen ("disjoin.in" , "r" , stdin );
    freopen ("disjoin.out" , "w" , stdout );
    int x,y,op,p;
    scanf ("%d %d " , &n , &p );
    for ( int i = 1 ; i <= n ; ++i )
    {
        tata[i]=i;
        nod[i]=1;
    }
    for ( int i = 1 ; i <= p ; ++i )
    {
        scanf ("%d %d %d " , &op , &x ,&y );
        if (op==1)reuniune(x,y);
        else
        {
                    if (sameset(x,y))printf ("DA\n");
                    else
                    printf ("NU\n");
        }
    }
    return 0;
}