Cod sursa(job #1354342)

Utilizator andrei_r_97Radoi Andrei andrei_r_97 Data 21 februarie 2015 19:28:06
Problema Sate Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.42 kb
#include <stdio.h>
#include <stdlib.h>

#define MAX_N 30000
#define MOD(Z) ( ((Z) > (0)) ? (Z) : (-Z))

int n, m, x, y;
int vizitat[MAX_N + 1];
long long distanta[MAX_N + 1];

typedef struct GrafNode {
  int node;
  long long dist;
  struct GrafNode *next;
} GrafNode;

GrafNode *g[MAX_N + 1];

void adauga(int a, int b, long long d) {
  GrafNode *p = malloc( sizeof(GrafNode) );
  p -> node = b;
  p -> dist = d;
  p -> next = g[a];
  g[a] = p;
}

void citesteGraf(FILE *in) {
  fscanf(in, "%d %d %d %d", &n, &m, &x, &y);

  int i, a, b, d;
  for (i = 1; i <= m; i++) {
    fscanf(in, "%d %d %d", &a, &b, &d);
    adauga(a, b, d);
    adauga(b, a, d);
  }
}

int coada[MAX_N];

void BFS(int nod) {

  int L = 0;
  coada[L] = nod;

  int i;
  GrafNode *p;

  for (i = 0; i <= L; i++)
    for (p = g[ coada[i] ]; p != NULL; p = p -> next)
      if (distanta[p -> node] == 0 && p -> node != nod) {

        if (p -> node > coada[i]) {
          distanta[p -> node] = distanta[ coada[i] ] - p -> dist;
        }

        else {
          distanta[p -> node] = distanta[ coada[i] ] + p -> dist;
        }
        coada[++L] = p -> node;
      }

}

int main()
{
  FILE *in  = fopen("sate.in", "r");
  FILE *out = fopen("sate.out", "w");

  citesteGraf(in);
  BFS(x);

  if ( distanta[y] )
    fprintf(out, "%lld", MOD(distanta[y]) );
  else
    fprintf(out, "0");
  return 0;
}