Cod sursa(job #1577421)

Utilizator vapopescuVlad Andrei Popescu vapopescu Data 23 ianuarie 2016 14:00:38
Problema Sate Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.33 kb
#include <iostream>
#include <fstream>
#include <string.h>
#define N 300010
#define M 1000250
using namespace std;

ifstream fin("sate.in");
ofstream fout("sate.out");

class lista {
public:
  int inc[N];
  int vf[M];
  int dist[M];
  int urm[M];
  int len;

  int bfsN[N];
  int bfsA[N];
  bool bfsV[N];

  void add(int x, int y, int d){
    len++;
    vf[len] = y;
    dist[len] = d;
    urm[len] = inc[x];
    inc[x] = len;
  }

  void read(int x){
    int i = inc[x];
    while (i != 0) {
      int varf = vf[i];
      //Fa ceva
      i = urm[i];
    }
  }

  int bfs(int x, int y){
    memset(bfsV, 0, sizeof(bool) * N);
    int i = 0, n = 0;
    bfsN[n] = x;
    bfsA[n] = 0;
    n++;

    while (i < n && bfsN[i] != y) {
      int k = inc[bfsN[i]];
      while (k != 0) {
        if (!bfsV[vf[k]]) {
          bfsN[n] = vf[k];
          bfsV[vf[k]] = true;
          bfsA[n] = bfsA[i] + dist[k];
          n++;
        }

        k = urm[k];
      }
      i++;
    }

    return bfsA[i];
  }
} l;

int main() {
  int n, m, x, y, a, b, d;
  fin >> n >> m >> x >> y;

  for (int i = 0; i <= m; i++) {
    fin >> a >> b >> d;
    if (a > b)
      d = -d;
    l.add(a, b, d);
    l.add(b, a, -d);
  }

  fout << l.bfs(x, y);

  fin.close();
  fout.close();
  return 0;
}