Cod sursa(job #1294718)

Utilizator dianaa21Diana Pislaru dianaa21 Data 18 decembrie 2014 01:10:38
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
#include <fstream>
#include <vector>
using namespace std;
ifstream is ("disjoint.in");
ofstream os ("disjoint.out");

vector<int>parent, r;
int N, M, c, x, y;

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

int main()
{
    is >> N >> M;
    parent.resize(N+1);
    r.resize(N+1);

    for(int i = 1; i <= N; ++i)
        parent[i] = i;

    for(int i = 1; i <= M; ++i)
    {
        is >> c >> x >> y;
        if(c == 1)
            Union(Find(x), Find(y));
        else
        {
            if(Find(x) == Find(y))
                os << "DA\n";
            else
                os << "NU\n";
        }
    }
    is.close();
    os.close();
    return 0;
}
void Union(int x, int y)
{
    if(r[x] > r[y])
        parent[y] = x;
    if(r[x] < r[y])
        parent[x] = y;
    if(r[x] == r[y])
    {
        parent[x] = y;
        r[y]++;
    }


}
int Find(int x)
{
    int R = x, y;

    while(parent[R] != R)
        R = parent[R];

    while(parent[x] != x)
    {
        y = parent[x];
        parent[x] = R;
        x = y;
    }
    return R;
}