Cod sursa(job #2367065)

Utilizator Radu_FilipescuFilipescu Radu Radu_Filipescu Data 5 martie 2019 08:10:45
Problema Sate Scor 30
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.19 kb
#include <fstream>
#include <vector>
#include <deque>
#include <cmath>

using namespace std;

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

const int NMAX = 30005;

int N, M;
int X, Y;

vector <int> Ad[NMAX];
vector <int> D[NMAX];

int dist[NMAX];

void Read()
{
  fin >> N >> M >> X >> Y;

  int a, b, d;

  for( int i = 1; i <= M; ++i )
  {
    fin >> a >> b >> d;

    Ad[a].push_back( b );
    D[a].push_back( d );

    Ad[b].push_back( a );
    D[b].push_back( d );
  }

  fin.close();
}

void Do()
{
  dist[X] = 1;

  deque <int> Q;

  Q.push_back( X );
  bool done = false;

  int u, w;

  while( !Q.empty() && !done )
  {
    u = Q.front();
    Q.pop_front();

    for( int i = 0; i < Ad[u].size(); ++i )
    {
      w = Ad[u][i];

      if( dist[w] == 0 )
      {
        if( ( X <= u && u <= w ) || ( w <= u && u <= X ) ) dist[w] = dist[u] + D[u][i];
        else dist[w] = abs( dist[u] - D[u][i] );

        Q.push_back( w );
        if( w == Y )
        {
          done = true;
          break;
        }
      }
    }

  }

  fout << dist[Y] - 1 << '\n';
}

int main()
{
    Read();
    Do();

    return 0;
}