Cod sursa(job #2001983)

Utilizator Narniuss08Bogdan Anghelache Narniuss08 Data 18 iulie 2017 12:37:48
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include <iostream>
#include <fstream>

const int dim = 100001;

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

int tata[dim], rang[dim];

int Find(int x){

        int root, y;

        for(root = x; root != tata[root]; root = tata[root]);

                //path compresion
                while(tata[x] != x) {
                        y = tata[x];
                        tata[x] = root;
                        x = y;
                }

        return root;
}

void Union(int x, int y){

        if(Find(x)!=Find(y)) {
                if(rang[x] > rang[y]) {
                        tata[y] = x;
                }
                else if(rang[x] < rang[y]) {
                        tata[x] = y;
                }
                else{
                        tata[y] = x;
                        rang[x]++;
                }
        }
}
int main(){

        int n,m;
        fin>>n>>m;
        for(int i = 1; i <= n; i++) {
                tata[i] = i;
                rang[i] = 1;
        }

        for(int i = 1; i <= m; i++) {
                int x, y, cod;
                fin>>cod>>x>>y;
                if(cod == 1) {
                        Union(Find(x),Find(y));
                }else{
                        if(Find(x) == Find(y)) {
                                fout<<"DA\n";
                        }
                        else{
                                fout<<"NU\n";
                        }
                }
        }
        return 0;
}