Cod sursa(job #1987566)

Utilizator flaviu_2001Craciun Ioan-Flaviu flaviu_2001 Data 31 mai 2017 08:43:14
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.97 kb
#include <fstream>

using namespace std;

int n, m;
int radacina[100005], rang[100005];

int find(int x){
    int R;
    for (R = x; radacina[R] != R; R = radacina[R]);
    for (; radacina[x] != x;){
        int y = radacina[x];
        radacina[x] = R;
        x = y;
    }
    return R;
}

void unite(int x, int y)
{
    if(rang[x] > rang[y])
        radacina[y] = x;
    else radacina[x] = y;

    if(rang[x] == rang[y])
        ++rang[y];
}

int main()
{
    for (int i = 1; i < 100005; ++i)
        radacina[i] = i,
        rang[i] = 1;
    ifstream fin ("disjoint.in");
    ofstream fout ("disjoint.out");
    fin >> n >> m;
    while(m--){
        int type, x, y;
        fin >> type >> x >> y;
        switch(type){
            case 2:
                if(find(x) == find(y))
                    fout << "DA\n";
                else fout << "NU\n";
                break;
            case 1:
                unite(find(x), find(y));
                break;
        }
    }
    return 0;
}