Pagini recente » Cod sursa (job #1107135) | Cod sursa (job #3330412) | Cod sursa (job #3316041) | Cod sursa (job #673338) | Cod sursa (job #1016720)
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
typedef struct node{
struct node *parent;
int value;
int nodeRank;
} NODE;
NODE * nodes[100001];
int n,m;
NODE *findSet(NODE *p){
if (p == p->parent){
return p;
} else {
p->parent = findSet(p->parent);
return p->parent;
}
}
void union_set(NODE *p1, NODE *p2){
NODE *repr1 = findSet(p1);
NODE *repr2 = findSet(p2);
if (repr1->nodeRank > repr2->nodeRank){
repr2->parent = repr1;
} else if (repr2->nodeRank > repr1->nodeRank){
repr1->parent = repr2;
} else {
repr1->parent = repr2;
repr2->nodeRank = repr2->nodeRank + 1;
}
}
int areInSameSet(NODE *p1, NODE *p2){
NODE *repr1 = findSet(p1);
NODE *repr2 = findSet(p2);
if (repr1->value == repr2->value){
return 1;
}
else {
return 0;
}
}
void performOperation(int op, int elem1, int elem2){
switch(op){
case 1:
union_set(nodes[elem1], nodes[elem2]);
break;
case 2:
if (areInSameSet(nodes[elem1], nodes[elem2])){
printf("DA\n");
} else {
printf("NU\n");
}
break;
}
}
void initSets(){
for (int i=1; i<=n; i++){
NODE *p = (NODE *) malloc(sizeof(NODE));
p->value = i;
p->parent = p;
p->nodeRank = 0;
nodes[i] = p;
}
}
int main()
{
freopen("disjoint.in", "r", stdin);
freopen("disjoint.out", "w", stdout);
scanf("%d %d", &n, &m);
initSets();
int op, elem1, elem2;
for (int i=0; i<m; i++){
scanf("%d %d %d", &op, &elem1, &elem2);
performOperation(op, elem1, elem2);
}
return 0;
}