Pagini recente » Cod sursa (job #2227610) | Cod sursa (job #605122) | Cod sursa (job #437291) | Cod sursa (job #2903907) | Cod sursa (job #1222342)
#include <iostream>
#include <stack>
#include <vector>
#include <utility>
using namespace std;
struct TreeNode{
int val;
struct TreeNode *parent;
struct TreeNode(int v) : val(v), parent(NULL) {}
};
int n, m, op, a, b;
vector<struct TreeNode*> trees;
vector<int> ranks;
void make_set(int a){
trees.push_back(new struct TreeNode(a));
}
int find(int a){
struct TreeNode *t = trees.at(a);
while(t->parent != NULL){
t = t->parent;
}
return t->val;
}
void link(int a, int b){
int pa = find(a);
int pb = find(b);
struct TreeNode *ppa = trees.at(pa);
struct TreeNode *ppb = trees.at(pb);
ppb->parent = ppa;
}
void uunion(int a, int b){
if(ranks.at(a) > ranks.at(b)){
link(a, b);
}else{
link(b, a);
if(ranks.at(a) == ranks.at(b)){
ranks.at(b)++;
}
}
}
int main(){
freopen("disjoint.in", "r", stdin);
freopen("disjoint.out", "w", stdout);
scanf("%d%d", &n, &m);
for(int i = 0; i < n; i++){
make_set(i);
ranks.push_back(0);
}
for(int i = 0; i < m; i++){
scanf("%d%d%d", &op, &a, &b);
a--, b--;
switch(op){
case 1:
uunion(a, b);
break;
case 2:
(find(a) == find(b))? printf("DA\n") : printf("NU\n");
}
}
}