Cod sursa(job #1929845)

Utilizator satzaFoldesi Richard satza Data 18 martie 2017 10:51:22
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include <iostream>
#include <fstream>

using namespace std;

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

int n, m, op, x, y;

struct edges{
    int src, dest;
}e[100002];

struct subset{
    int parent, rnk;
}s[100002];

void makeSet(){
    for(int i = 1; i <= n; i++){
        s[i].parent = i;
        s[i].rnk = 0;
    }
}

int findSet(int x){
    if(x != s[x].parent) s[x].parent = findSet(s[x].parent);

    return s[x].parent;
}

void unionSet(int x, int y){

    int xroot, yroot;
    xroot = findSet(x);
    yroot = findSet(y);

    if(s[x].rnk == s[y].rnk) {
        s[xroot].rnk = s[xroot].rnk + 1;
        s[yroot].parent = xroot;
    }
    else{
        if(s[xroot].rnk > s[yroot].rnk) s[yroot].parent = xroot;
        else s[xroot].parent = yroot;
    }
}
int main()
{
    in >> n >> m;

    makeSet();
    for(int i = 1; i <= m; i++){
        in >> op >> x >> y;
        e[i].src = x; e[i].dest = y;

        if(op == 1) unionSet(x, y);
        else {
            x = findSet(x);
            y = findSet(y);
            if(x == y) out << "DA\n";
            else out << "NU\n";
        }
    }
    return 0;
}