Cod sursa(job #539249)

Utilizator mraresMardare Rares mrares Data 22 februarie 2011 19:02:06
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.98 kb
#include<fstream>
#define nmax 100005

using namespace std;

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

int n,m;
int qq[nmax],rr[nmax];

int find(int nod)
{
    int r,x,y;
    //caut radacina
    for(r=nod;r!=qq[r];r=qq[r]);
    x=nod;
    //compresia arborelui
    while(x!=qq[x])
    {
        y=qq[x];
        qq[x]=r;
        x=y;
    }
    return r;
}

void unesc(int x,int y)
{
    if(rr[x]>rr[y])
        qq[y]=x;
    else
        qq[x]=y;

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

int main()
{
    int i,x,y,cod;
    fin>>n>>m;
    for(i=1;i<=n;++i)
    {
        //init
        qq[i]=i;
        rr[i]=1;
    }
    for(i=1;i<=m;++i)
    {
        fin>>cod>>x>>y;
        if(cod==1)
            if(find(x)!=find(y))
                unesc(find(x),find(y));
            else;
        else
            if(find(x)==find(y))
                fout<<"DA\n";
            else
                fout<<"NU\n";
    }
    return 0;
}