Pagini recente » Cod sursa (job #1437779) | Cod sursa (job #738441) | Cod sursa (job #1376448) | Cod sursa (job #1446539) | Cod sursa (job #2855038)
#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;
}