Cod sursa(job #989807)

Utilizator gunner_292Mihai Manolescu gunner_292 Data 26 august 2013 15:32:35
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1 kb
#include<fstream>
#define dmax 100003

using namespace std;

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

int n, m;

int father[dmax];
int nRank[dmax];

void join(int a, int b)
{
    while(father[a] != -1)
        a = father[a];

    while(father[b] != -1)
        b = father[b];

    if(nRank[a] > nRank[b])
    {
        father[b] = a;
    }
    else if(nRank[b] > nRank[a])
    {
        father[a] = b;
    }
    else
    {
        father[b] = a;
        nRank[a] ++;
    }
}


void query(int a, int b)
{
    while(father[a] != -1)
        a = father[a];

    while(father[b] != -1)
        b = father[b];

    if(a == b)
    {
        out<<"DA\n";
    }
    else out<<"NU\n";
}


int main()
{
    in>>n>>m;

    for(int i=1; i<=n; i++)
    {
        nRank[i] = 1;
        father[i] = -1;
    }

    for(int i=1; i<=m; i++)
    {
        int op, a, b;

        in>>op>>a>>b;

        if(op == 1)
            join(a, b);
        else query(a, b);
    }

    in.close();
    out.close();

    return 0;
}