Cod sursa(job #840924)

Utilizator UnforgivenMihai Catalin Botezatu Unforgiven Data 23 decembrie 2012 14:39:32
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include <fstream>
#include <cstdio>
#include <cstdlib>
#define MAX_SIZE 100100

int rang[MAX_SIZE];
int tree[MAX_SIZE];
int N , M;

using namespace std;

int find_root(int x)
{
    int radacina = x;
    int y = x;
    while ( radacina != tree[radacina])
    {
        radacina = tree[radacina];
    }
    while ( x != tree[x])
    {
        y = tree[x];
        tree[x] = radacina;
        x = y;
    }

    return radacina;
}

void unite_trees(int x , int y)
{
    if ( rang[x] > rang[y])
    {
        tree[y] = x;
    }
    else
    {
        tree[x] = y;
    }

    if (rang[x] == rang[y])
    {
        rang[y]++;
    }
}

int main()
{
    ifstream input("disjoint.in");
    ofstream output("disjoint.out");

    input >> N >> M;

    for (int i =1;i<=N;i++)
    {
        rang[i] = 1;
        tree[i] = i;
    }

    for (int i =1;i<=M;i++)
    {
        int op , x , y;
        input >> op >>  x >> y;
        if (op == 1)
        {
           unite_trees(find_root(x) , find_root(y));
        }
        else
        {
            if (find_root(x) == find_root(y)) output << "DA\n";
            else output << "NU\n";
        }
    }
    input.close();
    output.close();
    return 0;
}