Cod sursa(job #1024216)

Utilizator cristitamasTamas Cristian cristitamas Data 8 noiembrie 2013 14:04:10
Problema Paduri de multimi disjuncte Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.02 kb
#include <fstream>
using namespace std;

int N,M;
int H[100005];
int Tata[100005];

void Formare()
{
    for(int i=1;i<=N;++i)
        Tata[i]=i;
}

int FindFather(int x)
{
    int Root,aux;
    Root=x;
    while(Root!=Tata[Root])
        Root=Tata[Root];
    while(x!=Tata[x])
    {
        aux=Tata[x];
        Tata[x]=Root;
        x=aux;
    }
    return Root;
}


void Unite(int x,int y)
{
    if(H[x]>H[y])
        Tata[y]=x;
    else
        Tata[x]=y;
    if(H[x]==H[y])
        H[y]++;
}


int main()
{
    ifstream f("disjoint.in");
    ofstream fout("disjoint.out");
    f>>N>>M;
    Formare();
    int x,y,Op;
    for(int i=1;i<=M;++i)
    {
        f>>Op>>x>>y;
        if(Op==1)
        {
            Unite(x,y);
            continue;
        }
        if(Op==2)
        {
            if(FindFather(x)==FindFather(y))
                fout<<"DA\n";
            else
                fout<<"NU\n";
        }
    }
    f.close();
    fout.close();
    return 0;
}