Cod sursa(job #1473092)

Utilizator stoianmihailStoian Mihail stoianmihail Data 18 august 2015 15:43:53
Problema Sate Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.4 kb
#include <stdio.h>

#define Smerenie 200050
#define Nadejde 30001

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

int N, M, X, Y;
int d[Nadejde];
int Q[Nadejde];
int qhead, qtail;
int adj[Nadejde];
cell l[Smerenie];
char seen[Nadejde];

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

/** Pune in coada "u". **/
void enqueue(int u) {
  Q[qtail++] = u;
}

/** Ia capul cozii. **/
void dequeue(int *u) {
  (*u) = Q[qhead++];
}

/** Afla distanta de la "X" la "Y". **/
int bfs(int u) {
  int v, pos;
  enqueue(u);
  seen[u] = 1;
  do {
    dequeue(&u);
    for (pos = adj[u]; pos; pos = l[pos].next) {
      v = l[pos].v;
      if (!seen[v]) {
        enqueue(v);
        seen[v] = 1;
        d[v] = d[u] + l[pos].w;
      }
    }
  } while ((!seen[Y]) && (qhead != qtail));
  return d[Y];
}

int main(void) {
  int i, u, v, w;
  FILE *f = fopen("sate.in", "r");

  /// Citeste graful.
  fscanf(f, "%d %d %d %d", &N, &M, &X, &Y);
  for (i = 1; i <= M; i++) {
    fscanf(f, "%d %d %d", &u, &v, &w);
    addEdge(u, v, w, i);
    addEdge(v, u, -w, i + M);
  }
  fclose(f);

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

  /// Afiseaza rezultatul
  fprintf(f, "%d\n", bfs(X));
  fclose(f);

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