Cod sursa(job #1314560)

Utilizator retrogradLucian Bicsi retrograd Data 11 ianuarie 2015 23:16:42
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.8 kb
#include<fstream>
#include<vector>
using namespace std;

ifstream fin("disjoint.in");
ofstream fout("disjoint.out");

vector<int> RANK, LEADER;
int n, Q;

int Find(int v) {
    if(LEADER[v] == 0) return v;
    else return Find(LEADER[v]);
}
void Union (int r1, int r2) {
    if(RANK[r1] < RANK[r2]) {
        LEADER[r1] = r2;
    } else if(RANK[r1] > RANK[r2]) {
        LEADER[r2] = r1;
    } else {
        LEADER[r1] = r2;
        RANK[r2] ++;
    }
}

int main() {
    fin>>n>>Q;
    RANK.resize(n+1, 0);
    LEADER.resize(n+1, 0);
    int type; int a, b;
    for(int i=1; i<=Q; i++) {
        fin>>type>>a>>b;
        if(type == 1) {
            Union(Find(a), Find(b));
        }
        else {
            fout<< ((Find(a) == Find(b))?"DA":"NU") <<'\n';
        }
    }
}