Pagini recente » Cod sursa (job #632472) | Cod sursa (job #232637) | Cod sursa (job #2822374) | Cod sursa (job #3158745) | Cod sursa (job #2806838)
#include <iostream>
#include <fstream>
#include <bits/stdc++.h>
#define nmax 100010
using namespace std;
ifstream f("disjoint.in");
ofstream g("disjoint.out");
//Memorez multimile ca arbori
// Folosesc un vector de tati si un vector pentru inaltimile arborilor
int tata[nmax]={0}, h[nmax]={0};
// Reprezentantul unei multimi este radacina arborelui
int reprez(int u) {
while (tata[u] != 0)
u = tata[u];
return u;
}
void reuneste(int u, int v) {
// Gasesc radacinile arborilor din care fac parte cele doua valori
int ru=reprez(u), rv=reprez(v);
// Se leaga printr-o muchie cele doua radacini
if (h[ru] > h[rv])
tata[rv] = ru;
else {
tata[ru] = rv;
// In caz de egalitate se incrementeaza inaltimea unui arbore cu 1
if (h[ru] == h[rv])
h[rv]++;
}
}
int main()
{ int n,m,op,x,y;
f>>n>>m;
for(int j=0; j<m; j++){
f>>op>>x>>y;
if(op==1){
reuneste(x,y);
}
else {
if(reprez(x)==reprez(y)) g<<"DA\n";
else g<<"NU\n";
}
}
f.close();
g.close();
return 0;
}