Cod sursa(job #825101)

Utilizator VisuianMihaiMihai Visuian VisuianMihai Data 27 noiembrie 2012 14:50:40
Problema Paduri de multimi disjuncte Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.05 kb
#include <fstream>
using namespace std;
ifstream fin("disjoint.in");
ofstream fout("disjoint.out");

int rang[100001], t[100001], x, y, op ,n, m;
int GetRoot(int x)
{
    int i;
    for ( i = x; i != t[i]; i = t[i]);
    while ( x != t[x] )
    {
        int aux = t[x];
        t[x] = i;
        x = aux;
    }
    return i;
}

void Reunite(int x, int y)
{
    x == GetRoot(x);
    y = GetRoot(y);
    if ( x == y )
        return;
    if ( rang[x] == rang[y] )
        rang[y]++;
    if ( rang[x] > rang[y] )
        t[y] = x;
    else t[x] = y;
}

int main()
{
    fin >> n >> m;
    for ( int i = 1; i <= n; i++ )
    {
        t[i] = i;
        rang[i] = 1;
    }
    for ( int i = 1; i <= m; i++ )
    {
        fin >> op >> x >> y;
        if ( op == 1 )
            Reunite(x,y);
        else
        {
            if ( GetRoot(x) == GetRoot(y) )
            {
                fout << "DA\n";
            }
            else fout<< "NU\n";
        }
    }
    fin.close();
    fout.close();
    return 0;
}