Pagini recente » Monitorul de evaluare | Monitorul de evaluare | Monitorul de evaluare | Monitorul de evaluare | Cod sursa (job #1473439)
#include <stdio.h>
#define Nadejde 100000
/** Algoritmul Union-Find.
* Multumim Doamne!
**/
int N, M, ss;
int stack[Nadejde]; /// stiva union-find.
int boss[Nadejde + 1]; /// boss[i] este seful lui "i".
char *answer[2] = {"NU\n", "DA\n"};
/** Gaseste radacina lui "u". **/
int find(int u) {
for (; boss[u]; u = boss[u]) {
stack[ss++] = u;
}
int root = u;
while (ss) {
boss[stack[--ss]] = root;
}
return root;
}
/** Reuneste multimea lui "u" cu a lui "v". **/
void unify(int u, int v) {
boss[find(v)] = find(u);
}
int main(void) {
int task, u, v;
FILE *in = fopen("disjoint.in", "r");
FILE *out = fopen("disjoint.out", "w");
fscanf(in, "%d %d", &N, &M);
while (M--) {
fscanf(in, "%d %d %d", &task, &u, &v);
if (task == 1) {
unify(u, v);
} else {
fputs(answer[find(u) == find(v)], out);
}
}
fclose(in);
fclose(out);
/// Multumim Doamne!
puts("Doamne ajuta!");
return 0;
}