Cod sursa(job #2497510)

Utilizator RadianElevenAdrian Ariotn RadianEleven Data 22 noiembrie 2019 19:49:35
Problema Paduri de multimi disjuncte Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.14 kb
#include <iostream>
#include <fstream>

using namespace std;
ifstream f ("disjoint.in");
ofstream g ("disjoint.out");
int n,m;
int t[100005];
int h[100005];
int fnd(int x)
{
    while(x!=t[x])
        x=t[x];
    return x;
}
int calc(int x)
{
    int y=x;
    y=fnd(y);
    while(t[x]!=y)
    {
        int z=x;
        x=t[x];
        t[z]=y;
    }
    return y;
}
void join(int x, int y)
{
    x=calc(x);
    y=calc(y);
    if(x==y)
        return;
    if(h[x]==h[y])
    {
        t[x]=y;
        h[x]++;
        return;
    }
    if(h[x]>h[y])
    {
        t[y]=x;
        return;
    }
    if(h[x]<h[y])
    {
        t[x]=y;
        return;
    }
}
bool is(int x, int y)
{
    if(fnd(x)==fnd(y))
        return true;
    return false;
}
int main()
{
    f>>n>>m;
    for(int i=1;i<100005;++i)
    {
        t[i]=i;
        h[i]=1;
    }
    for(int i=1;i<=m;++i)
    {
        int c,x,y;
        f>>c>>x>>y;
        if(c==1)
        {
            join(x,y);
        } else {
            if(is(x,y))
                g<<"DA\n";
            else g<<"NU\n";
        }
    }
    return 0;
}