Cod sursa(job #2855038)

Utilizator vladburacBurac Vlad vladburac Data 22 februarie 2022 01:51:28
Problema Sate Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.56 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
const int NMAX = 3e4;
const int INF = 2e9;

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

struct Edge{
  int node, cost;
};
vector <Edge> graph[NMAX];
queue <int> bfsQueue;
int dist[NMAX];
bool marked[NMAX];
int n;

void bfs1( int node ) {
  int i;
  for( i = 0; i < n; i++ )
    marked[i] = false;
  bfsQueue.push( node );
  marked[node] = true;
  while( !bfsQueue.empty() ) {
    int qfront = bfsQueue.front();
    bfsQueue.pop();
    for( auto edge: graph[qfront] ) {
      if( !marked[edge.node] ) {
        marked[edge.node] = true;
        bfsQueue.push( edge.node );
        for( auto it: graph[edge.node] ) {
          if( !marked[it.node] ) {
            if( qfront < edge.node && qfront < it.node ) {
              if( edge.node < it.node )
                graph[qfront].push_back( { it.node, edge.cost + it.cost } );
              else
                graph[qfront].push_back( { it.node, edge.cost - it.cost } );
            }
            else if( edge.node < qfront && edge.node < it.node ) {
              if( qfront < it.node )
                graph[qfront].push_back( { it.node, it.cost - edge.cost } );
              else
                graph[qfront].push_back( { it.node, edge.cost - it.cost } );
            }
            else {
              if( qfront < edge.node )
                graph[qfront].push_back( { it.node, it.cost - edge.cost } );
              else
                graph[qfront].push_back( { it.node, edge.cost + it.cost } );
            }
          }
        }
      }
    }
  }
}

void bfs( int node ) {
  int i;
  while( !bfsQueue.empty() )
    bfsQueue.pop();
  for( i = 0; i < n; i++ )
    marked[i] = false, dist[i] = INF;
  bfsQueue.push( node );
  marked[node] = true;
  dist[node] = 0;
  while( !bfsQueue.empty() ) {
    int qfront = bfsQueue.front();
    bfsQueue.pop();
    for( auto edge: graph[qfront] ) {
      if( dist[edge.node] > dist[qfront] + edge.cost ) {
        dist[edge.node] = dist[qfront] + edge.cost;
        if( !marked[edge.node] ) {
          marked[edge.node] = true;
          bfsQueue.push( edge.node );
        }
      }
    }
    marked[qfront] = false;
  }
}

int main() {
  int m, x, y, i, a, b, d;
  fin >> n >> m >> x >> y;
  x--;
  y--;
  for( i = 0; i < m; i++ ) {
    fin >> a >> b >> d;
    a--;
    b--;
    graph[a].push_back( { b, d } );
    graph[b].push_back( { a, d } );
  }
  bfs1( 0 );
  bfs( x );
  fout << dist[y];
  return 0;
}