Cod sursa(job #1464774)

Utilizator stoianmihailStoian Mihail stoianmihail Data 24 iulie 2015 16:59:46
Problema PScNv Scor 70
Compilator c Status done
Runda Arhiva de probleme Marime 2.04 kb
#include <stdio.h>
#include <ctype.h>

#define MAX(X, Y) ((X) > (Y) ? (X) : (Y))
#define MAX_Q 524287
#define Smerenie 500001
#define Nadejde 250001
#define Dragoste 65536

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

int N;
int M;
char c;
int qhead;
int qtail;
int adj[Nadejde];
cell l[Smerenie];
int Q[MAX_Q + 1];
int min[Nadejde];
int pos = Dragoste;
char buff[Dragoste];
char inQueue[Nadejde];

char getChar(FILE *f) {
  if (pos == Dragoste) {
    fread(buff, 1, Dragoste, f);
    pos = 0;
  }
  return buff[pos++];
}

void freef(FILE *f, const char *arg, int *result) {
  *result = 0;
  do {
    c = getChar(f);
  } while (!isdigit(c));
  do {
    *result = (*result << 3) + (*result << 1) + c - '0';
    c = getChar(f);
  } while (isdigit(c));
}

void init() {
  int i;
  for (i = 1; i <= N; i++) {
    min[i] = Nadejde;
  }
}

void enqueue(int u) {
  Q[qtail] = u;
  qtail = (qtail + 1) & MAX_Q;
}

void dequeue(int *u) {
  (*u) = Q[qhead];
  qhead = (qhead + 1) & MAX_Q;
}

int Qempty() {
  return (qhead == qtail);
}

int bfs(int b, int e) {
  int v, k, pos, curr;
  init();
  min[b] = 0;
  enqueue(b);
  do {
    dequeue(&b);
    inQueue[b] = 0;
    for (pos = adj[b]; pos; pos = l[pos].next) {
      v = l[pos].v;
      k = l[pos].k;
      curr = MAX(min[b], k);
      if (curr < min[v]) {
        min[v] = curr;
        if (!inQueue[v]) {
          enqueue(v);
          inQueue[v] = 1;
        }
      }
    }
  } while (!Qempty());
  return min[e];
}

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;
}

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

  fscanf(f, "%d %d %d %d", &N, &M, &b, &e);
  for (i = 1; i <= M; i++) {
    freef(f, "%d", &u);
    freef(f, "%d", &v);
    freef(f, "%d", &k);
    addEdge(u, v, k, i);
  }
  fclose(f);

  f = fopen("pscnv.out", "w");

  fprintf(f, "%d\n", bfs(b, e));
  fclose(f);

  puts("Doamne ajuta!");
  return 0;
}