Cod sursa(job #825789)

Utilizator VisuianMihaiMihai Visuian VisuianMihai Data 29 noiembrie 2012 16:26:58
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.97 kb
#include <fstream>
using namespace std;
ifstream fin("disjoint.in");
ofstream fout("disjoint.out");

int t[100001], rang[100001], n, m, x, y, op;

int GetRoot(int x) // Caut radacina arborelui
{
    if ( x != t[x] )
        return t[x] = GetRoot(t[x]);
    return x;
}

void Unite(int x,int y) // Unesc multimile, x si y sunt radacinile
{
    if ( rang[x]>rang[y] )
        t[y] = x;
    else
    {
        t[x] = y;
        if ( rang[x] == rang[y] )
            rang[y]++;
    }
}

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