Cod sursa(job #1538955)

Utilizator Liviu0010Oprescu Liviu Liviu0010 Data 30 noiembrie 2015 02:19:29
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.03 kb
#include<fstream>
#include<vector>
using namespace std;

vector<int> t, rg;

int find(int x)
{
    int rez = x, c;

    while(rez != t[rez])
        rez = t[rez];

    while(t[x] != x)
    {
        c = t[x];
        t[x] = rez;
        x = c;
    }

    return rez;
}

void unite(int x, int y)
{
    int _x = find(x), _y = find(y);

    if(rg[_x] < rg[_y])
        t[_x] = _y;
    else
        t[_y] = _x;

    if(rg[_x] == rg[_y])
        rg[_y]++;
}

int main()
{
    fstream in("disjoint.in", ios::in), out("disjoint.out", ios::out);
    int n, i, op, x, y;

    in>>n;

    for(i = 0; i<n; i++)
    {
        t.push_back(i);
        rg.push_back(1);
    }

    in>>n;

    for(i=0; i < n; i++)
    {
        in>>op>>x>>y;

        x--;
        y--;

        if(op == 1)
            unite(x,y);
        else
            if(find(x) == find(y))
                out<<"DA\n";
            else
                out<<"NU\n";
    }

    in.close();
    out.close();


    return 0;
}