Pagini recente » Cod sursa (job #652472) | Cod sursa (job #1409785) | Cod sursa (job #3129583) | Cod sursa (job #929641) | Cod sursa (job #485581)
Cod sursa(job #485581)
#include<fstream>
#define maxn 100005
using namespace std;
int t[maxn], rg[maxn], n;
void makeset(){
for (int i = 1; i <= n; i++){
t[i] = i;
rg[i] = 0;
}
}
int find(int x){
if (x == t[x])
return x;
else {
t[x] = find(t[x]);
return t[x];
}
}
int find2(int x){
int r = x;
while (t[r] != r)
r = t[r];
int y;
while (x != t[x]){
y = t[x];
t[x] = r;
x = y;
}
}
void unionn(int x, int y){
x = find2(x);
y = find2(y);
if (rg[x] > rg[y])
t[y] = x;
else
if (rg[y] > rg[x])
t[x] = y;
else
if (x != y){
t[y] = x;
rg[x]++;
}
}
int main(){
ifstream f("disjoint.in");
ofstream g("disjoint.out");
int m, i, j, c, x, y;
f>>n>>m;
makeset();
for (i = 1; i <= m; i++){
f>>c>>x>>y;
if (c == 1)
unionn(x, y);
else {
x = find2(x);
y = find2(y);
if (x == y)
g<<"DA"<<'\n';
else
g<<"NU"<<'\n';
}
}
return 0;
}