7-9 旅遊規劃 (25 分)
原題鏈接:https://pintia.cn/problem-sets/15/problems/717
這道題目主要考察的就是Dijkstra算法。
只是在他的基礎上有一點變形,原來只是有一個邊權,但是現在有兩個,一個是路徑的長度,另一個是花費。
所以只需要把Dijkstra算法中更新路徑長度的地方再加上關於花費的更新就行了。
代碼:
#include <iostream>
using namespace std;
const int MAX = 520;
const int INFO = 100000;
int N,M,S,D;
int G[MAX][MAX]; //長度
int F[MAX][MAX]; //費用
int Dist[MAX]; //最短路徑
int Val[MAX]; //花費
int book[MAX];
void Dijkstra(){
int min,k;
book[S] = 1;
while(1){
min = INFO;
for(int i=0;i<N;i++){
if(!book[i] && Dist[i] < min){
k = i;
min = Dist[i];
}
}
if(min == INFO) break;
book[k] = 1;
for(int i=0;i<N;i++){
if(!book[i] && G[k][i] + Dist[k] <= Dist[i]){
if(G[k][i] + Dist[k] < Dist[i]){
Dist[i] = G[k][i] + Dist[k];
Val[i] = F[k][i] + Val[k];
} else {
if(F[k][i] + Val[k] < Val[i]){
Val[i] = F[k][i] + Val[k];
}
}
}
}
}
}
int main(){
int V1,V2,Len,Fee;
scanf("%d%d%d%d",&N,&M,&S,&D);
for(int i=0;i<N;i++){ //初始化G[][],F[][]
Dist[i] = INFO;
Val[i] = INFO;
for(int j=0;j<N;j++){
if(i == j){
G[i][j] = 0;
F[i][j] = 0;
} else {
G[i][j] = INFO;
F[i][j] = INFO;
}
}
}
for(int i=0;i<M;i++){ //讀入數據,初始化Len,Fee
scanf("%d%d%d%d",&V1,&V2,&Len,&Fee);
G[V1][V2] = Len; G[V2][V1] = Len;
F[V1][V2] = Fee; F[V2][V1] = Fee;
}
Dist[S] = 0;
Val[S] = 0;
for(int i=0;i<N;i++){ //DijKstra初始化
if(G[S][i] != INFO){
Dist[i] = G[S][i];
Val[i] = F[S][i];
}
}
Dijkstra();
printf("%d %d\n",Dist[D],Val[D]);
system("pause");
return 0;
}