Pagini recente » Cod sursa (job #923201) | Cod sursa (job #1359177) | Cod sursa (job #598326) | Cod sursa (job #2894103) | Cod sursa (job #1704102)
#include <iostream>
#include <stdio.h>
#include <queue>
#include <stdlib.h>
#include <algorithm>
#include <vector>
typedef struct Arb
{
int parent, rank;
}Arbs;
int FindSet(int a, std::vector<Arbs*> arbsVect) {
if (a != arbsVect[a]->parent) {
arbsVect[a]->parent = FindSet(arbsVect[a]->parent, arbsVect);
}
return arbsVect[a]->parent;
}
Arbs * MakeSet(int i) {
Arbs *arb = (Arbs*)malloc(sizeof(Arbs));
arb->parent = i;
arb->rank = 0;
return arb;
}
void Union(int a, int b, std::vector<Arbs*> arbsVect) {
int aParent, bParent;
aParent = FindSet(a, arbsVect);
bParent = FindSet(b, arbsVect);
if (arbsVect[aParent]->rank > arbsVect[bParent]->rank) {
arbsVect[bParent]->parent = aParent;
} else {
arbsVect[aParent]->parent = bParent;
}
if (arbsVect[aParent]->rank == arbsVect[bParent]->rank) {
arbsVect[bParent]->rank++;
arbsVect[aParent]->parent = bParent;
}
}
int main() {
FILE *in = fopen("disjoint.in", "r");
FILE *out = fopen("disjoint.out", "w");
int N, M;
fscanf(in, "%d %d", &N, &M);
std::vector<Arbs*> arbsVect;
for (int i = 0; i < N; i++) {
arbsVect.push_back(MakeSet(i));
}
for (int i = 0; i < M; i++) {
int cod, x, y;
fscanf(in, "%d %d %d", &cod, &x, &y);
if (cod == 1) {
Union(x - 1, y - 1, arbsVect);
} else {
if (FindSet(x - 1, arbsVect) != FindSet(y - 1, arbsVect)) {
fprintf(out, "NU\n");
} else {
fprintf(out, "DA\n");
}
}
}
return 0;
}