Cod sursa(job #1934865)

Utilizator RaresEGaySopterean Adrian RaresEGay Data 21 martie 2017 21:19:36
Problema Paduri de multimi disjuncte Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 0.96 kb
#include <fstream>

#define MAX 100005

using namespace std;

ifstream f("disjoint.in");
ofstream g("disjoint.out");

int n, m;
int parent[MAX], rang[MAX];

inline void MakeSet(int x){
    parent[x] = x;
    rang[x] = 0;
}

int Union(int x, int y){
    int xRoot = parent[x];
    int yRoot = parent[y];

    if(rang[x] > rang[y]) parent[y] = xRoot;
    else if(rang[y] > rang[x]) parent[x] = yRoot;
    else{
        parent[y] = xRoot;
        ++rang[x];
    }
}

int Find(int x){
    if(parent[x] != x)
        parent[x] = Find(parent[x]);
    return parent[x];

}

int main(){
    f >> n >> m;
    for(int i = 1; i <= n; ++i) MakeSet(i);
    while(m){
        --m;
        int operation;
        int x, y;
        f >> operation;
        f >> x >> y;
        if(operation == 1){
            Union(x, y);
        }
        else{
            if(parent[x] == parent[y]) g << "DA\n";
            else g << "NU\n";
        }
    }
}