Cod sursa(job #1468898)

Utilizator horiainfoTurcuman Horia horiainfo Data 7 august 2015 11:22:00
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
#include <fstream>

#define NMAX 100002
using namespace std;

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


struct elem{int h,rad;} nod[NMAX];
int op, nod1, nod2, n, m;

int radacina(int nod1)
{
    while(nod[nod1].rad != nod1 )
        nod1 = nod[nod1].rad;
    return nod1;
}

void AddRadacina(int nod1,int r)
{
    int nod2;
    while(nod[nod1].rad != r )
        nod2 = nod1, nod1 = nod[nod1].rad, nod[nod2].rad = r;
}

void unire(int nod1,int nod2)
{
    int r1 = radacina(nod1);
    int r2 = radacina(nod2);

    if(nod[r1].h >= nod[r2].h)
        nod[r2].rad = r1, nod[r1].h = max( nod[r1].h , nod[r2].h + 1);
    else
        nod[r1].rad = r2, nod[r2].h = max( nod[r2].h , nod[r1].h + 1);
}

bool verif(int nod1,int nod2)
{
    int r1 = radacina(nod1);
    int r2 = radacina(nod2);

    AddRadacina(nod1,r1);
    AddRadacina(nod2,r2);

    return r1==r2;
}

int main()
{
    fin>>n>>m;
    for(int i=1;i<=n;i++)
        nod[i].rad = i, nod[i].h = 1;
    for(int i=1;i<=m;i++)
    {
        fin>>op>>nod1>>nod2;
        if(op==1)
        {
            unire(nod1,nod2);
        }
        else
        {
            if(verif(nod1,nod2))
                fout<<"DA"<<'\n';
            else
                fout<<"NU"<<'\n';
        }
    }
    return 0;
}