Cod sursa(job #2390558)

Utilizator Sergiu.VictorTalmacel Sergiu Victor Sergiu.Victor Data 28 martie 2019 10:40:15
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.37 kb
#include <iostream>
#include <vector>
#include <fstream>
using  namespace std;

const int NMAX = 100001;

ifstream fin("disjoint.in");
ofstream fout("disjoint.out");
int N,M;

int get_root(int x,vector<int>& parinte)
{
    if(parinte[x]!=x)
    {
        x=parinte[x];
        return get_root(x,parinte);
    }
    return x;
}
bool disjoint(int x, int y,vector<int>&parinte)
{
    return (get_root(x,parinte)!=get_root(y,parinte));
}
void uneste(int x, int y,vector<int>&rang,vector<int> &comp)
{
        int par_x=get_root(x,comp);
        int par_y= get_root(y,comp);
        if(rang[par_x]<rang[par_y])
            comp[par_x]=comp[par_y];
        else if(rang[par_x]>rang[par_y])
            comp[par_y]=comp[par_x];
        else {
            comp[par_x] = comp[par_y];
            rang[par_y]++;
        }

}
void rez()
{
    fin>>N>>M;
    vector<int> rang(N,0);
    vector<int> comp(N);
    for(int i=0;i<comp.size();i++)
        comp[i]=i;
    int op,x,y;
    for(int i=0;i<M;i++)
    {
        fin>>op>>x>>y;
        switch(op)
        {
            case 1:
                if(disjoint(x-1,y-1,comp)) uneste(x-1,y-1,rang,comp);
                break;
            case 2:
                if(!disjoint(x-1,y-1,comp)) fout<<"DA\n";
                else fout<<"NU\n";
                break;
            default:
                break;
        }

    }
}
int main() {
      rez();
    return 0;
}