Cod sursa(job #1612932)

Utilizator tamionvTamio Vesa Nakajima tamionv Data 25 februarie 2016 09:19:59
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include <iostream>
#include <vector>
#include <fstream>
using namespace std;

class merge_find{
    int n;
    vector<int> tata, adanc;
public:
    merge_find(const int N): n(N), tata(n, 0), adanc(n, 1){
        for(int i = 0; i < n; ++i){
            tata[i] = i;
        }
    }
    int find(int x){
        int y = x;
        for( ; y != tata[y]; y = tata[y]);
        for(int tmp = 0; x != y; tmp = tata[x], tata[x] = y, x = tmp);
        return x;
    }
    void merge(int a, int b){
        a = find(a), b = find(b);
        if(a == b){
            return;
        }
        if(adanc[a] < adanc[b]){
            swap(a, b);
        }
        if(adanc[a] == adanc[b]){
            ++adanc[a];
        }
        tata[b] = a;
    }
    bool same(const int a, const int b){
        return find(a) == find(b);
    }
};

int main()
{
    ifstream f("disjoint.in");
    ofstream g("disjoint.out");
    int n, m;
    f >> n >> m;

    merge_find mf(n);

    for(int i = 0, t, a, b; i < m; ++i){
        f >> t >> a >> b;
        --a, --b;
        if(t == 1){
            mf.merge(a, b);
        }
        else{
            g << (mf.same(a, b) ? "DA\n" : "NU\n");
        }
    }

    return 0;
}