Pagini recente » Cod sursa (job #3121472) | Cod sursa (job #1880183) | Cod sursa (job #1579883) | Cod sursa (job #1522658) | Cod sursa (job #2806754)
#include <fstream>
#include <vector>
using namespace std;
ifstream f("disjoint.in");
ofstream g("disjoint.out");
vector<int> rad(100000);
vector<int> rang(100000);
int find(int x) {
int i, y;
//merg in sus pe arbore pana gasesc un nod care pointeaza catre el insusi
i=x;
while(rad[i]!=i){
i=rad[i];
}
//aplic compresia drumurilor
while(rad[x]!=x) {
y = rad[x];
rad[x] = i;
x = y;
}
return i;
}
void unite(int x, int y) {
//unesc multimea cu rang mai mic de cea cu rang mai mare
if (rang[x] > rang[y])
rad[y] = x;
else rad[x] = y;
//in caz ca rangurile erau egale atunci cresc rangul noii multimi cu 1
if (rang[x] == rang[y]) rang[y]++;
}
int main() {
int n, m;
f >> n >> m;
for(int i = 1 ; i <= n ; ++i){
rang[i]=1;
rad[i]=i;
}
for (int i = 0; i < m; ++i) {
int x, y, z;
f >> x >> y >> z;
if (x == 1) {
int r1,r2;
r1=find(y);
r2=find(z);
if(r1!=r2)
unite(r2, r1);
}
else {
if (x == 2) {
if (find(y) == find(z)) {
g << "DA" << '\n';
} else {
g << "NU" << '\n';
}
}
}
}
return 0;
}