Pagini recente » Cod sursa (job #402595) | Cod sursa (job #1578090) | Rating Ana Cirligeanu (AnaCirligeanu1) | Cod sursa (job #133876) | Cod sursa (job #2602451)
#include <fstream>
#include <limits>
#include <vector>
#include <queue>
#define NMAX 100020
using namespace std;
ifstream fin("disjoint.in");
ofstream fout("disjoint.out");
int find(vector<int>& parent, int a) {
int parenta = a;
while (parenta != parent[parenta]) {
parenta = parent[parenta];
}
while (a != parent[parenta]) {
int tmp = parent[a];
parent[a] = parenta;
a = tmp;
}
return parenta;
}
void union_find(vector<int>& rank, vector<int>& parent, int a, int b) {
int parent_a = find(parent,a);
int parent_b = find(parent,b);
if (rank[parent_a] >= rank[parent_b]) {
parent[parent_b] = parent_a;
} else {
parent[parent_a] = parent_b;
}
if (rank[parent_a] == rank[parent_b]) {
++rank[parent_a];
}
}
int main()
{
int n, m, idx, a, b;
fin>>n>>m;
vector<int> parent(n);
vector<int> rank(n);
for (int i = 0; i < n; ++i) {
parent[i] = i;
rank[i] = 1;
}
vector<string> ret;
for (int i=0; i<m; ++i) {
fin>>idx>>a>>b;
if (idx == 2) {
ret.push_back(find(parent,a) == find(parent,b) ? "DA\n" : "NU\n");
} else {
union_find(rank, parent, a, b);
}
}
for (int i = 0; i < ret.size(); ++i) {
fout<<ret[i];
}
fin.close();
fout.close();
}