Cod sursa(job #2685838)

Utilizator RNedelcuNedelcu Radu RNedelcu Data 17 decembrie 2020 20:12:12
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.18 kb
#include <iostream>
#include <bits/stdc++.h>
#define MAX 100002
using namespace std;
ifstream in("disjoint.in");
ofstream out("disjoint.out");
int N,M;
vector<int> tata;
vector<int> h;
void initializare()
{
    tata.resize(MAX);
    h.resize(MAX);
    fill(tata.begin(),tata.end(),0);
    fill(h.begin(),h.end(),0);
}

int reprez(int nod)
{
    while(tata[nod]!=0)
    {
        nod = tata[nod];
    }
    return nod;
}
void echilibreaza(int nod, int nou)
{   int aux;
     while(tata[nod]!=0)
    {   aux = nod;
        nod = tata[nod];
        tata[aux] = nou;
    }
}
void reuneste(int a, int b)
{
    int r1 = reprez(a);
    int r2 = reprez(b);
    if(h[r1]>h[r2])
        {   echilibreaza(b,r1);
            tata[r2]=r1;
        }
    else
    {   echilibreaza(a,r2);
        tata[r1]=r2;
        if(h[r1]==h[r2])
            h[r2]++;
    }
}
int main()
{
    int x,y,cod;
    initializare();
    in>>N>>M;
    for(int i=1; i<=M; i++)
    {
        in>>cod>>x>>y;
        if(cod==1)
            reuneste(x,y);
        else if(reprez(x)==reprez(y))
            out<<"DA\n";
        else
            out<<"NU\n";

    }
    return 0;
}