Pagini recente » Cod sursa (job #1281833) | Cod sursa (job #2312739) | Cod sursa (job #2338750) | Cod sursa (job #3192278) | Cod sursa (job #1704921)
#include <iostream>
#include <fstream>
#include <vector>
std::ifstream f("disjoint.in");
std::ofstream g("disjoint.out");
int N, M;
int parent[100001];
int rank[100001];
/*UnionFind(int size) {
parent = new int[size];
rank = new int[size];
for(int i = 0 ; i < size ; ++i){
parent[i] = i; //just create independent subsets
rank[i] = 0;
}
}*/
int find(int x){
if(parent[x] != x){
parent[x] = find(parent[x]);
}
return parent[x];
}
void Union(int x,int y){
int xRoot = find(x);
int yRoot = find(y);
if(xRoot == yRoot){
return;
}
//
if(rank[xRoot] < rank[yRoot]){
parent[xRoot] = yRoot;
}else if(rank[xRoot] > rank[yRoot]){
parent[yRoot] = xRoot;
}else{
parent[yRoot] = xRoot;
rank[xRoot] += 1;
}
}
int main(){
f >> N >> M;
for(int i = 1 ; i <= N ; ++i){
parent[i] = i;
}
int c, x, y;
for(int i = 0 ; i < M ; ++i){
f >> c >> x >> y ;
if(c == 1){
Union(x,y);
continue;
}
//else if(c == 2)
if(find(x) == find(y)){
g << "DA\n";
}else{
g << "NU\n";
}
}
return 0 ;
}