Cod sursa(job #1879901)

Utilizator FlowstaticBejan Irina Flowstatic Data 15 februarie 2017 11:21:07
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.93 kb
#include <fstream>
#define NMAX 100020
#define FOR(i,a,b) for(int i = a; i<=b; i++)
using namespace std;
ifstream fin("disjoint.in");
ofstream fout("disjoint.out");

int ta[NMAX],ra[NMAX];
int N,M;

int Find(int x)
{
    int r,y;

    for(r = x;  ta[r]!=r; r = ta[r]);//urc pana gasesc un nod care pointeaza la el

    for(;ta[x]!=x;)//compresie
    {
        y = ta[x];
        ta[x] = r;
        x = y;
    }
    return r;
}

void Reuniune(int x, int y)
{
    if(ra[x] > ra[y])
        ta[y] = x;
    else
        ta[x] = y;

    if(ra[x] == ra[y]) ra[y]++;
}

int main()
{
    fin>>N>>M;
    FOR(i,1,N)
    {
        ta[i] = i;
        ra[i] = 1;
    }
    int x,y,cod;
    FOR(i,1,M)
    {
        fin>>cod>>x>>y;
        if(cod == 1)
            Reuniune(Find(x),Find(y));
        else
        {
            if(Find(x) == Find(y))
                fout<<"DA"<<'\n';
            else
                fout<<"NU"<<'\n';
        }
    }

    return 0;

}