Cod sursa(job #345700)

Utilizator freak93Adrian Budau freak93 Data 4 septembrie 2009 12:22:24
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.87 kb
#include<fstream>

using namespace std;

const char iname[]="disjoint.in";
const char oname[]="disjoint.out";
const int maxn=100005;

ifstream f(iname);
ofstream g(oname);

int A[maxn],L[maxn],i,n,m,x,y,z;

int anc(int x)
{
    int a,y;
    for(a=x;a!=A[a];a=A[a]);

    for(;A[x]!=x;x=A[x])
    {
        y=A[x];
        A[x]=a;
        x=y;
    }

    return a;
}

void merge(int x,int y)
{
    if(L[x]<L[y])
        A[x]=y;
    else
        A[y]=x;
    if(L[x]==L[y])
        ++L[x];
}

int main()
{
    f>>n>>m;
    for(i=1;i<=n;++i)
        A[i]=i,L[i]=1;
    for(i=1;i<=m;++i)
    {
        f>>x>>y>>z;
        if(x==2)
            if(anc(y)==anc(z))
                g<<"DA\n";
            else
                g<<"NU\n";
        else
            merge(anc(y),anc(z));
    }

    f.close();
    g.close();

    return 0;
}