Cod sursa(job #1466571)

Utilizator stoianmihailStoian Mihail stoianmihail Data 29 iulie 2015 15:27:21
Problema PScNv Scor 60
Compilator c Status done
Runda Arhiva de probleme Marime 1.8 kb
#include <stdio.h>

#define Smerenie 1000001
#define Nadejde 250001

typedef struct {
  int v, k, next;
} cell;

int N;
int M;
int X;
int Y;
int mid;
int adj[Nadejde];   /// capetele listelor de adiacenta.
cell l[Smerenie];   /// listele de adiacenta alocate static.
char seen[Nadejde]; /// seen[i] este 1 doar daca nodul i a fost vizitat.

/** Adauga-l pe "v" la lista de adiacenta a lui "u". **/
void addEdge(int u, int v, int k, int pos) {
  l[pos].v = v;
  l[pos].k = k;
  l[pos].next = adj[u];
  adj[u] = pos;
}

/** Initializeaza "seen". **/
void init() {
  int u;
  for (u = 1; u <= N; u++) {
    seen[u] = 0;
  }
}

/** Parcurge recursiv graful, cu capacitatea "mid". **/
void dfs(int u) {
  int pos;
  if (!seen[u]) {
    seen[u] = 1;
    for (pos = adj[u]; pos; pos = l[pos].next) {
      if (mid >= l[pos].k) {
        dfs(l[pos].v);
      }
    }
  }
}

/** Determina daca putem ajunge in "Y" cu capacitatea "mid". **/
void step(int lo, int hi) {
  mid = (lo + hi) >> 1;
  init();
  dfs(X);
}

/** Cauta binar capacitatea minima. **/
int bSearch(int lo, int hi) {
  while (hi - lo > 1) {
    step(lo, hi);
    if (seen[Y]) {
      hi = mid;
    } else {
      lo = mid;
    }
  }
  int save = mid;
  step(lo, hi);
  if (seen[Y]) {
    return mid;
  } else {
    return save;
  }
}

int main(void) {
  int i, u, v, k, max = 1;
  FILE *f = fopen("pscnv.in", "r");

  fscanf(f, "%d %d %d %d", &N, &M, &X, &Y);
  for (i = 1; i <= M; i++) {
    fscanf(f, "%d %d %d", &u, &v, &k);
    addEdge(u, v, k, i);
    addEdge(v, u, k, i + M);
    if (k > max) {
      max = k;
    }
  }
  fclose(f);

  f = fopen("pscnv.out", "w");
  fprintf(f, "%d\n", bSearch(1, max));
  fclose(f);

  /** Multumim Doamne! **/
  puts("Doamne ajuta!");
  return 0;
}