Pagini recente » Cod sursa (job #817468) | Cod sursa (job #2351282) | Cod sursa (job #1801189) | Cod sursa (job #1296974) | Cod sursa (job #2009796)
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream cin("disjoint.in");
ofstream cout("disjoint.out");
class Graph {
public:
Graph(int n) {
this -> n = n;
_root.resize(n + 1);
_size.resize(n + 1);
for (int i = 1; i <= n; i ++) {
_size[i] = 1;
_root[i] = i;
}
}
void link(int x, int y) {
_link(x, y);
}
void query(int x, int y) {
_get_root(x) == _get_root(y) ? cout << "DA" << '\n' : cout << "NU" << '\n';
}
private:
int n;
vector < int > _size;
vector < int > _root;
int _get_root(int node) {
int r = node;
while (r != _root[r])
r = _root[r];
while (node != _root[node]) {
int aux = _root[node];
_root[node] = r;
node = aux;
}
return _root[node];
}
void _link(int x, int y) {
int rx = _get_root(x);
int ry = _get_root(y);
if (_size[rx] >= _size[ry]) {
_size[rx] += _size[ry];
_root[y] = _root[x];
}
else {
_size[ry] += _size[rx];
_root[x] = _root[y];
}
}
};
int main() {
int n, m;
cin >> n >> m;
Graph *graph = new Graph(n);
for (int i = 1; i <= m; i ++) {
int type;
cin >> type;
if (type == 1) {
int x, y;
cin >> x >> y;
graph -> link(x, y);
}
else {
int x, y;
cin >> x >> y;
graph -> query(x, y);
}
}
}