Cod sursa(job #738798)

Utilizator BitOneSAlexandru BitOne Data 21 aprilie 2012 16:19:42
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.88 kb
#include <fstream>
#include <cstdlib>

using namespace std;

const int N_MAX=100011;

int f[N_MAX], r[N_MAX];

inline int _min(int x, int y) {return x <= y ? x : y;}
int find(int x)
{
    int y, z;

    for(y=x; y != f[y]; y=f[y]);
    for(; x != f[x]; x=z)
    {
        z=f[x];
        f[x]=y;
    }
    return y;
}
inline void Unite(int x, int y)
{
    if(r[x] == r[y])
    {
        if(x != y)
            f[y]=x;
        ++r[y];
    }
    else r[x]=r[y]=_min(r[x], r[y]);
}
int main()
{
    int N, M, i, op, x, y;
    ifstream in("disjoint.in");
    ofstream out("disjoint.out");

    in>>N>>M;
    for(i=1; i <= N; ++i)
        f[i]=i, r[i]=1;
    for(; M; --M)
    {
        in>>op>>x>>y;
        if(1 == op)
            Unite(find(x), find(y));
        else out<<(find(x) == find(y) ? "DA" : "NU" )<<'\n';
    }
    return EXIT_SUCCESS;
}