Pagini recente » Cod sursa (job #1645884) | Cod sursa (job #2105034) | Cod sursa (job #2799068) | Cod sursa (job #2227507) | Cod sursa (job #1612932)
#include <iostream>
#include <vector>
#include <fstream>
using namespace std;
class merge_find{
int n;
vector<int> tata, adanc;
public:
merge_find(const int N): n(N), tata(n, 0), adanc(n, 1){
for(int i = 0; i < n; ++i){
tata[i] = i;
}
}
int find(int x){
int y = x;
for( ; y != tata[y]; y = tata[y]);
for(int tmp = 0; x != y; tmp = tata[x], tata[x] = y, x = tmp);
return x;
}
void merge(int a, int b){
a = find(a), b = find(b);
if(a == b){
return;
}
if(adanc[a] < adanc[b]){
swap(a, b);
}
if(adanc[a] == adanc[b]){
++adanc[a];
}
tata[b] = a;
}
bool same(const int a, const int b){
return find(a) == find(b);
}
};
int main()
{
ifstream f("disjoint.in");
ofstream g("disjoint.out");
int n, m;
f >> n >> m;
merge_find mf(n);
for(int i = 0, t, a, b; i < m; ++i){
f >> t >> a >> b;
--a, --b;
if(t == 1){
mf.merge(a, b);
}
else{
g << (mf.same(a, b) ? "DA\n" : "NU\n");
}
}
return 0;
}