Dijkstra邻接表
# include <iostream>
# include <vector>
# include <algorithm>
using namespace std;
const int INF = 0xffffff ;
struct ArcNode{
int v;
int distance, cost;
} ;
int N, M;
int S, D;
vector< ArcNode> G[ 510 ] ;
int dist[ 510 ] ;
int cost[ 510 ] ;
bool vis[ 510 ] ;
vector< int > pre ( 510 ) ;
void Dijkstra ( int s) {
fill ( dist, end ( dist) , INF) ;
fill ( cost, end ( cost) , INF) ;
fill ( vis, end ( vis) , false ) ;
for ( int i = 0 ; i < N; ++ i) pre[ i] = i;
dist[ s] = 0 ;
cost[ s] = 0 ;
for ( int i = 0 ; i < N ; ++ i) {
int u = - 1 ;
int MIN = INF;
for ( int j = 0 ; j < N ; ++ j) {
if ( vis[ j] == false && dist[ j] < MIN) {
u = j;
MIN = dist[ j] ;
}
}
if ( u == - 1 ) return ;
vis[ u] = true ;
for ( ArcNode next: G[ u] ) {
if ( vis[ next. v] == false ) {
if ( dist[ u] + next. distance < dist[ next. v] ) {
dist[ next. v] = dist[ u] + next. distance;
cost[ next. v] = cost[ u] + next. cost;
pre [ next. v] = u;
}
else
if ( dist[ u] + next. distance == dist[ next. v] ) {
if ( cost[ u] + next. cost < cost[ next. v] ) {
cost[ next. v] = cost[ u] + next. cost;
pre [ next. v] = u;
}
}
}
}
}
}
void printPATH ( int v) {
if ( v == S) {
cout << S << " " ;
return ;
}
printPATH ( pre[ v] ) ;
cout << v << " " ;
}
int main ( ) {
cin >> N >> M >> S >> D;
for ( int i = 0 ; i < M; ++ i) {
int C1, C2, d, c;
cin >> C1 >> C2 >> d >> c;
G[ C1] . push_back ( { C2, d, c} ) ;
G[ C2] . push_back ( { C1, d, c} ) ;
}
Dijkstra ( S) ;
printPATH ( D) ;
cout << dist[ D] << " " << cost[ D] << endl;
return 0 ;
}
Dijkstra + DFS邻接表
# include <iostream>
# include <vector>
# include <algorithm>
using namespace std;
const int INF = 0xffffff ;
struct ArcNode{
int v;
int distance, cost;
} ;
int N, M;
int S, D;
vector< ArcNode> G[ 510 ] ;
int dist[ 510 ] ;
bool vis[ 510 ] ;
vector< int > pre[ 510 ] ;
void Dijkstra ( int s) {
fill ( dist, end ( dist) , INF) ;
fill ( vis, end ( vis) , false ) ;
dist[ s] = 0 ;
for ( int i = 0 ; i < N ; ++ i) {
int u = - 1 ;
int MIN = INF;
for ( int j = 0 ; j < N ; ++ j) {
if ( vis[ j] == false && dist[ j] < MIN) {
u = j;
MIN = dist[ j] ;
}
}
if ( u == - 1 ) return ;
vis[ u] = true ;
for ( ArcNode next: G[ u] ) {
if ( vis[ next. v] == false ) {
if ( dist[ u] + next. distance < dist[ next. v] ) {
dist[ next. v] = dist[ u] + next. distance;
pre [ next. v] . clear ( ) ;
pre [ next. v] . push_back ( u) ;
}
else
if ( dist[ u] + next. distance == dist[ next. v] ) {
pre [ next. v] . push_back ( u) ;
}
}
}
}
}
vector< int > path, tempPath;
int minSumCost = INF;
void DFS ( int v) {
if ( v == S) {
tempPath. push_back ( S) ;
int sumcost = 0 ;
for ( int i = tempPath. size ( ) - 1 ; i > 0 ; -- i) {
int id = tempPath[ i] , idnext = tempPath[ i- 1 ] ;
for ( int REALidnext = 0 ; REALidnext < G[ id] . size ( ) ; ++ REALidnext)
if ( G[ id] [ REALidnext] . v == idnext)
sumcost + = G[ id] [ REALidnext] . cost;
}
if ( sumcost < minSumCost) {
minSumCost = sumcost;
path = tempPath;
}
tempPath. pop_back ( ) ;
return ;
}
tempPath. push_back ( v) ;
for ( int u: pre[ v] )
DFS ( u) ;
tempPath. pop_back ( ) ;
}
int main ( ) {
cin >> N >> M >> S >> D;
for ( int i = 0 ; i < M; ++ i) {
int C1, C2, d, c;
cin >> C1 >> C2 >> d >> c;
G[ C1] . push_back ( { C2, d, c} ) ;
G[ C2] . push_back ( { C1, d, c} ) ;
}
Dijkstra ( S) ;
DFS ( D) ;
for ( int i = path. size ( ) - 1 ; i>= 0 ; i-- )
cout << path[ i] << " " ;
cout << dist[ D] << " " << minSumCost << endl;
return 0 ;
}