Pagini recente » Cod sursa (job #246433) | Cod sursa (job #2968565) | Cod sursa (job #29506) | Cod sursa (job #2199642) | Cod sursa (job #2908226)
#include <fstream>
using namespace std;
int sz[100001], parent[100001];
int n, numComponents, m;
int findGroup(int x){
int root = x;
while(parent[root] != root) {
root = parent[root];
}
//path compression
while(x != root) {
int next = parent[x];
parent[x] = root;
x = next;
}
return root;
}
void unify(int x, int y){
int grX = findGroup(x);
int grY = findGroup(y);
if(grX != grY) {
if(sz[grX] >= sz[grY]) {
parent[grY] = grX;
sz[grX] += sz[grY];
} else {
parent[grX] = grY;
sz[grY] += sz[grX];
}
numComponents--;
}
}
int main()
{
ifstream f("disjoint.in");
ofstream g("disjoint.out");
f >> n >> m;
numComponents = n;
for(int i = 1; i <= n; ++i) {
parent[i] = i;
sz[i] = i;
}
for(int i = 1; i <= m; ++i) {
int operation, x, y;
f >> operation >> x >> y;
if(operation == 1) {
unify(x, y);
} else if(operation == 2) {
if(findGroup(x) == findGroup(y)) {
g << "DA\n";
} else {
g << "NU\n";
}
}
}
return 0;
}