Cod sursa(job #1657773)

Utilizator iulian_f2kGuraliuc Iulian iulian_f2k Data 20 martie 2016 19:50:54
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.1 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;
vector<int> T, H;
int N, M;

void Read();
void Solve();
int Find(int x);
void Union(int x, int y);

int main()
{
    Read();
    Solve();
    return 0;
}
void Solve()
{
    int rx, ry, c, x, y;
    while(M--)
    {
        scanf("%d%d%d", &c, &x, &y);
        rx = Find(x);
        ry = Find(y);
        if(c == 1)
            Union(rx, ry);
        else
            if( rx == ry )
                cout<<"DA\n";
            else
                cout<<"NU\n";
    }
}
int Find(int x)
{
    int rx = x, z;
    while(T[rx])
        rx = T[rx];
    while(x != rx) {
        z = T[x];
        T[x] = rx;
        x = z;
    }
    return rx;
}
void Union(int rx, int ry)
{
    if(H[rx] > H[ry])
        T[ry] = rx;
    else if(H[rx] < H[ry])
        T[rx] = ry;
    else {
        H[rx]++;
        T[rx] = ry;
    }
}
void Read()
{
    freopen("disjoint.in", "rt", stdin);
    freopen("disjoint.out", "wt", stdout);
    scanf("%d%d", &N, &M);
    T.assign(N+2, 0);
    H.assign(N+2, 0);
}