7-9 旅遊規劃 (25 分)

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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章