Cod sursa(job #1284614)

Utilizator pop_bogdanBogdan Pop pop_bogdan Data 6 decembrie 2014 17:35:21
Problema Paduri de multimi disjuncte Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.01 kb
#include <fstream>
using namespace std;

ifstream is("disjoint.in");
ofstream os("disjoint.out");

int N, M, Type, X, Y;
int T[100001], Rank[100001];

int Find(int x);
void Union(int x, int y);

int main()
{
    is >> N >> M;
    for ( int i = 1; i <= N; ++i )
        T[i] = i;

    for ( int i = 1; i <= M; ++i )
    {
        is >> Type >> X >> Y;
        if ( Type == 2 )
        {
            if ( Find(X) == Find(Y) )
                os << "DA\n";
            else
                os << "NU\n";
        }
        else
        {
            Union(X,Y);
        }
    }
}

int Find(int x)
{
    int R(x), Temp;

    while ( T[R] != R )
        R = T[R];

    while ( T[x] != x )
    {
        Temp = T[x];
        T[x] = R;
        x = Temp;
    }

    return R;
}

void Union(int x, int y)
{
    if ( Rank[x] > Rank[y] )
        T[y] = x;
    if ( Rank[x] < Rank[y] )
        T[x] = y;
    if ( Rank[x] == Rank[y] )
    {
        T[x] = y;
        Rank[y]++;
    }
}