Cod sursa(job #2080246)

Utilizator pistvanPeter Istvan pistvan Data 2 decembrie 2017 17:25:40
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.99 kb
#include <iostream>
#include <fstream>
#define MaxN 100001
using namespace std;

ifstream f("disjoint.in");
ofstream g("disjoint.out");
int N, M, p[MaxN], rnk[MaxN], o, a, b;

int Find(int x)
{
    if (p[x] != x)
        p[x] = Find(p[x]);
    return p[x];
}

void Union(int x, int y)
{
    int rx = Find(x), ry = Find(y);
    if (rx == ry)
        return;
    if (rnk[rx] > rnk[ry])
    {
        p[ry] = rx;
        rnk[rx] = max(rnk[rx], rnk[ry]+1);
        rnk[ry] = 0;
    }
    else
    {
        p[rx] = ry;
        rnk[ry] = max(rnk[ry], rnk[rx]+1);
        rnk[rx] = 0;
    }
}

int main()
{
    f>>N>>M;
    for (int i=1;i<=N;i++)
        p[i] = i;
    for (int i = 0;i < M;i++)
    {
        f>>o>>a>>b;
        if (o==1)
            Union(a, b);
        else if (o==2)
        {
            a = Find(a);
            b = Find(b);
            if (a == b)
                g<<"DA\n";
            else
                g<<"NU\n";
        }
    }
}