Pagini recente » Cod sursa (job #3281045) | Cod sursa (job #239660) | Cod sursa (job #1241954) | Istoria paginii runda/de_placere/clasament | Cod sursa (job #2220414)
#include <bits/stdc++.h>
using namespace std;
const int NMax = 100003;
class DisjointSet{
public:
DisjointSet(){
for(int i = 0; i < NMax; ++i){
set_rank[i] = 1;
element_father[i] = i;
}
}
DisjointSet(int n){
for(int i = 1; i <= n; ++i){
set_rank[i] = 1;
element_father[i] = i;
}
}
void Union(int first_element, int second_element){
int first_root = GetRoot(first_element);
int second_root = GetRoot(second_element);
if(set_rank[first_root] > set_rank[second_root]){
set_rank[first_root] += set_rank[second_root];
element_father[second_root] = first_root;
}else{
set_rank[second_root] += set_rank[first_root];
element_father[first_root] = second_root;
}
}
int SameSet(int first_element, int second_element){
if(GetRoot(first_element) != GetRoot(second_element)){
return 0;
}
return 1;
}
private:
int set_rank[NMax];
int element_father[NMax];
int GetRoot(int node){
if(element_father[node] != node)
element_father[node] = GetRoot(element_father[node]);
return element_father[node];
}
};
int n,m;
int cod,x,y;
int main()
{
freopen("disjoint.in","r",stdin);
freopen("disjoint.out","w",stdout);
scanf("%d%d",&n,&m);
DisjointSet *disjoint_set = new DisjointSet{n};
for(int i = 1; i <= m; ++i){
scanf("%d%d%d",&cod,&x,&y);
if(1 == cod){
disjoint_set->Union(x,y);
}else if(2 == cod){
if(1 == disjoint_set->SameSet(x,y)){
printf("DA\n");
}else{
printf("NU\n");
}
}
}
return 0;
}