Pagini recente » Cod sursa (job #1008240) | Cod sursa (job #2413429) | Cod sursa (job #2317558) | Cod sursa (job #2426154) | Cod sursa (job #2824008)
#include <fstream>
#include <vector>
using namespace std;
const string filename = "disjoint";
ifstream fin(filename + ".in");
ofstream fout(filename + ".out");
class DSU {
private:
int parent;
int size;
public:
static vector<DSU> makeDSU(const int &n) {
vector<DSU> v(n + 1);
for (int i = 1; i <= n; i++) {
v[i].parent = i;
v[i].size = 1;
}
return v;
}
static int findParent(int x, vector<DSU> &v) {
while (v[x].parent != x) {
v[x].parent = v[v[x].parent].parent;
v[x].size = v[v[x].parent].size;
x = v[x].parent;
}
return x;
}
static void unite(int x, int y, vector<DSU> &v) {
x = findParent(x, v);
y = findParent(y, v);
if (x == y) {
return;
}
if (v[x].size > v[y].size) {
v[y].parent = x;
v[x].size += v[y].size;
} else {
v[x].parent = y;
v[x].size += v[x].size;
}
}
static bool checkDSU(int x, int y, vector<DSU> &v) {
if (findParent(x, v) == findParent(y, v)) {
return 1;
}
return 0;
}
};
int main() {
int n, t;
fin >> n >> t;
vector<DSU> v = DSU::makeDSU(n);
int c, x, y;
while (t--) {
fin >> c >> x >> y;
if (c == 1) {
DSU::unite(x, y, v);
}
if (c == 2) {
if (DSU::checkDSU(x, y, v) == 1) {
fout << "DA\n";
} else {
fout << "NU\n";
}
}
}
return 0;
}