Pagini recente » Cod sursa (job #111337) | Cod sursa (job #2325964) | Cod sursa (job #2327239) | Cod sursa (job #2507946) | Cod sursa (job #2083151)
#include<bits/stdc++.h>
#define nMax 100000
using namespace std;
ifstream f("disjoint.in");
ofstream g("disjoint.out");
int tata[nMax], nivel[nMax];
//cauta din tata in tata pana in radacina
int gaseste_tata(int nod){
if(nod != tata[nod]){
tata[nod] = gaseste_tata(tata[nod]);
}
return tata[nod];
}
//reuneste ramura lui x cu ramura lui y
void reuneste(int x, int y){
//unim ramurile la baza
x = gaseste_tata(x);
y = gaseste_tata(y);
//ramura mai mica este pusa in continuarea ramurei mai mari
if(nivel[x] > nivel[y]){
nivel[y] += nivel[x];
tata[y] = x;
}
else {
nivel[x] += nivel[y];
tata[x] = y;
}
}
// daca doua elemente au aceeasi radacina atunci sunt unite
bool sunt_unite(int x, int y){
x = gaseste_tata(x);
y = gaseste_tata(y);
return x == y;
}
int main(){
int n,q;
f>>n>>q;
//face fiecare element sa fie propriul sau tata si seteaza nivelul la 1
for(int i=1;i<=n;++i){
tata[i]=i;
nivel[i]=1;
}
for(int i=1;i<=q;++i){
int cod,x,y;
f>>cod>>x>>y;
if(cod==1) reuneste(x, y); //reuneste 2 ramuri
else
if(sunt_unite(x, y)) g<<"DA"<<'\n';
else g<<"NU"<<'\n';
}
}