Cod sursa(job #1128147)

Utilizator robert_stefanRobert Stefan robert_stefan Data 27 februarie 2014 15:37:43
Problema Paduri de multimi disjuncte Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 0.98 kb
#include <iostream>
#include <fstream>
#define IN "disjoint.in"
#define OUT "disjoint.out"
#define NMAX 100005

using namespace std;

ifstream in(IN);
ofstream out(OUT);

int n, m, tata[NMAX], rang[NMAX], cod;

inline int cauta(int a)
{
    int rad=a, aux;
    while(tata[rad] != rad)
        rad=tata[rad];
    while(tata[a] != rad)
        aux=tata[a],
        tata[a]=rad,
        a=aux;
    return rad;
}

inline void uneste(int a, int b)
{
    if(rang[a] > rang[b])
        tata[b]=a;
    else
    {
        if(rang[a]==rang[b])
            ++rang[b];
        tata[a]=b;
    }

}

int main()
{
    int i;
    in>>n>>m;
    for(i=1; i<=n; ++i)
        rang[i]=1, tata[i]=i;
    while(m--)
    {
        int a, b;
        in>>cod>>a>>b;
        if(cod==2)
            if(cauta(a) == cauta(b))
                out<<"DA\n";
            else out<<"NU\n";
        else
            uneste(a, b);
    }
    in.close();
    out.close();
    return 0;
}