Pagini recente » Cod sursa (job #770538) | Rating Teodora Mustea (teodora.mustea) | Cod sursa (job #849824) | Rating Sandu Irina (irinasandu) | Cod sursa (job #2602450)
#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" : "NU");
} else {
union_find(rank, parent, a, b);
}
}
}