个人模板
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int max_v = 1e3 + 5 ;
const int INF = 0x3f3f3f3f ;
int prev[ max_v] ;
int d[ max_v] ;
int cost[ max_v] [ max_v] ;
int used[ max_v] ;
int V, E;
void dijkstra ( int s)
{
fill ( d, d + V, INF) ;
fill ( used, used + V, false ) ;
fill ( prev, prev + V, - 1 ) ;
d[ s] = 0 ;
while ( true )
{
int v = - 1 ;
for ( int u = 0 ; u < V; u++ )
{
if ( ! used[ u] && ( v == - 1 || d[ u] < d[ v] ) )
v = u;
}
if ( v == - 1 )
break ;
used[ v] = true ;
for ( int u = 0 ; u < V; u++ )
{
if ( d[ u] > d[ v] + cost[ v] [ u] )
{
d[ u] = d[ v] + cost[ v] [ u] ;
prev[ u] = v;
}
}
}
}
vector< int > get_path ( int t)
{
vector< int > path;
for ( ; t != - 1 ; t = prev[ t] )
{
path. push_back ( t) ;
}
reverse ( path. begin ( ) , path. end ( ) ) ;
return path;
}
int main ( )
{
scanf ( "%d %d" , & V, & E) ;
for ( int i = 0 ; i < E; i++ )
{
int u, v, w;
scanf ( "%d %d %d" , & u, & v, & w) ;
cost[ u] [ v] = cost[ v] [ u] = w;
}
int s, t;
scanf ( "%d" , & s, & t) ;
dijkstra ( s) ;
vector< int > vec = get_path ( t) ;
vector< int > :: iterator p;
for ( p = vec. begin ( ) ; p != vec. end ( ) ; ++ p)
{
printf ( "%d " , * p) ;
}
printf ( "\n" ) ;
return 0 ;
}