Cod sursa(job #2220412)

Utilizator VladTiberiuMihailescu Vlad Tiberiu VladTiberiu Data 11 iulie 2018 17:13:48
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.79 kb
#include <bits/stdc++.h>

using namespace std;

const int NMax = 100003;

class DisjointSet{
public:
    DisjointSet(){
        for(int i = 0; i < NMax; ++i){
            set_rank[i] = 1;
            element_father[i] = i;
        }
    }
    DisjointSet(int n){
        for(int i = 1; i <= n; ++i){
            set_rank[i] = 1;
            element_father[i] = i;
        }
    }
    void Union(int first_element, int second_element){
        int first_root = GetRoot(first_element);
        int second_root = GetRoot(second_element);

        if(set_rank[first_root] > set_rank[second_root]){
            set_rank[first_root] += set_rank[second_root];
            element_father[second_root] = first_root;
        }else{
            set_rank[second_root] += set_rank[first_root];
            element_father[first_root] = second_root;
        }
    }
    int SameSet(int first_element, int second_element){
        if(GetRoot(first_element) != GetRoot(second_element)){
            return 0;
        }
        return 1;
    }
private:
    int set_rank[NMax];
    int element_father[NMax];

    int GetRoot(int node){
        while(element_father[node] != node)
            node = element_father[node];
        return node;
    }
};

int n,m;
int cod,x,y;

int main()
{
    freopen("disjoint.in","r",stdin);
    freopen("disjoint.out","w",stdout);
    scanf("%d%d",&n,&m);
    DisjointSet *disjoint_set = new DisjointSet{n};
    for(int i = 1; i <= m; ++i){
        scanf("%d%d%d",&cod,&x,&y);
        if(1 == cod){
            disjoint_set->Union(x,y);
        }else if(2 == cod){
            if(1 == disjoint_set->SameSet(x,y)){
                printf("DA\n");
            }else{
                printf("NU\n");
            }
        }
    }
    return 0;
}