Cod sursa(job #2076701)

Utilizator anca.sotirAnca Sotir anca.sotir Data 26 noiembrie 2017 22:38:19
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.06 kb
#include <fstream>
#define nmax 100001
using namespace std;
ifstream f("disjoint.in");
ofstream g("disjoint.out");
int tata[nmax],n,m,h[nmax];
int gasesteRadacina(int x)
{
    int rX=x;
    while(tata[rX]!=0)
        rX=tata[rX];
    int x2=tata[x];
    while(x2!=rX&&x2!=0)
    {
        tata[x]=rX;
        x=x2;
        x2=tata[x];
    }
    return rX;
}
void reuniune(int x,int y)
{
    int rX=gasesteRadacina(x);
    int rY=gasesteRadacina(y);
    if(h[rX]==h[rY])
    {
        tata[rY]=rX;
        ++h[rX];
    }
    else
    {
        if(h[rX]<h[rY])
            tata[rX]=rY;
        else
            tata[rY]=rX;
    }
}
void aceeasiMultime (int x,int y)
{
    int rX=gasesteRadacina(x);
    int rY=gasesteRadacina(y);
    if(rX==rY)
        g<<"DA\n";
    else g<<"NU\n";
}
int main()
{
    f>>n>>m;
    for(int i=1; i<=n; ++i)
        h[i]=1;
    for(int i=1;i<=m;++i)
    {
        int op,x,y;
        f>>op>>x>>y;
        if(op==1)
            reuniune(x,y);
        else aceeasiMultime(x,y);
    }
    return 0;
}