Cod sursa(job #1294372)

Utilizator radu_cebotariRadu Cebotari radu_cebotari Data 17 decembrie 2014 14:22:01
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.96 kb
#include<fstream>
using namespace std;
ifstream in("disjoint.in");
ofstream out("disjoint.out");
const int NMAX = 100000;

int tata[NMAX + 5],rg[NMAX + 5],n,m;

void read_init()
{

    in>>n>>m;
    for(int i = 1 ; i <= n ; i++)
        tata[i] = rg[i] = i;

}

int query(int x)
{

    int R,y;
    for(R = x ; R != tata[R] ; R = tata[R]);

    for( ; tata[x] != x ; ){
        y = tata[x];
        tata[x] = R;
        x = y;
    }

    return R;
}

void unite(int x,int y)
{

    if(rg[x] > rg[y])
        tata[y] = tata[x];
    else tata[x] = tata[y];
    if(rg[x] == rg[y])
        rg[y]++;
}

int main()
{

    read_init();
    int x,y,cod;
    for(int i = 1 ; i <= m ; i++){
        in>>cod>>x>>y;
        if(cod == 1)
            unite(query(x),query(y));
        else{
            if(query(x) == query(y))
                out<<"DA\n";
            else
                out<<"NU\n";
        }
    }
    return 0;
}