Cod sursa(job #2165694)

Utilizator catalinlupCatalin Lupau catalinlup Data 13 martie 2018 13:10:53
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.45 kb
#include <bits/stdc++.h>
#define INFILE "disjoint.in"
#define OUTFILE "disjoint.out"
using namespace std;
ifstream in(INFILE);
ofstream out(OUTFILE);
class UnionFind{
public:
    void Init(int n){
        parent.resize(n+1);
        sizeTree.resize(n+1);
        for(int i=1;i<=n;i++){
            parent[i]=i;
            sizeTree[i]=0;
        }
    }
    int FindRoot(int nod){
        while(nod!=parent[nod]){
            parent[nod]=parent[parent[nod]];
            nod=parent[nod];
        }
        return nod;
    }
    bool Connected(int nod1, int nod2){
        return FindRoot(nod1)==FindRoot(nod2);
    }
    void Connect(int nod1,int nod2){
        int root1=FindRoot(nod1);
        int root2=FindRoot(nod2);
        if(sizeTree[root1]>sizeTree[root2]){
            sizeTree[root1]+=sizeTree[root2];
            parent[root2]=root1;
        }
        else{
            sizeTree[root2]+=sizeTree[root1];
            parent[root1]=root2;
        }
    }
private:
    vector<int> parent;
    vector<int> sizeTree;
};

int main(){
    int N,M;
    in>>N>>M;
    UnionFind uf;
    uf.Init(N);
    for(int i=1;i<=M;i++){
        int tip,x,y;
        in>>tip>>x>>y;
        if(tip==1){
            uf.Connect(x,y);
        }
        else{
            if(uf.Connected(x,y)){
                out<<"DA\n";
            }
            else{
                out<<"NU\n";
            }
        }
    }
    return 0;
}