Cod sursa(job #1473439)

Utilizator stoianmihailStoian Mihail stoianmihail Data 19 august 2015 13:48:16
Problema Paduri de multimi disjuncte Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 0.98 kb
#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;
}