AC代码
#include <bits/stdc++.h>
using namespace std;
const int INF= 1000000000 ;
const int maxn= 501 ;
int G[ maxn] [ maxn] , d[ maxn] , cost[ maxn] [ maxn] , c[ maxn] , pre[ maxn] ;
int n, m, s, d1;
bool vis[ maxn] = { false } ;
void dijkstra ( )
{
fill ( d, d+ n, INF) ;
fill ( c, c+ n, INF) ;
d[ s] = 0 ;
c[ s] = 0 ;
for ( int i= 0 ; i< n; i++ ) pre[ i] = i;
for ( int i= 0 ; i< n; i++ )
{
int u= - 1 , Min= INF;
for ( int j= 0 ; j< n; j++ )
{
if ( vis[ j] == false && d[ j] < Min)
{
Min= d[ j] ;
u= j;
}
}
if ( u== - 1 ) return ;
vis[ u] = true ;
for ( int k= 0 ; k< n; k++ )
{
if ( vis[ k] == false && G[ u] [ k] != INF)
{
if ( d[ u] + G[ u] [ k] < d[ k] )
{
pre[ k] = u;
d[ k] = d[ u] + G[ u] [ k] ;
c[ k] = c[ u] + cost[ u] [ k] ;
}
else if ( d[ u] + G[ u] [ k] == d[ k] )
{
if ( c[ u] + cost[ u] [ k] < c[ k] )
{
pre[ k] = u;
c[ k] = c[ u] + cost[ u] [ k] ;
}
}
}
}
}
}
void DFS ( int d)
{
if ( d== s) {
printf ( "%d " , s) ;
return ;
}
DFS ( pre[ d] ) ;
printf ( "%d " , d) ;
}
int main ( )
{
int c1, c2, dis, cos;
scanf ( "%d%d%d%d" , & n, & m, & s, & d1) ;
fill ( G[ 0 ] , G[ 0 ] + maxn* maxn, INF) ;
for ( int i= 0 ; i< m; i++ )
{
scanf ( "%d%d%d%d" , & c1, & c2, & dis, & cos) ;
G[ c1] [ c2] = G[ c2] [ c1] = dis;
cost[ c1] [ c2] = cost[ c2] [ c1] = cos;
}
dijkstra ( ) ;
DFS ( d1) ;
printf ( "%d %d" , d[ d1] , c[ d1] ) ;
return 0 ;
}