1. 程式人生 > >07-圖6 旅遊規劃(25 分)

07-圖6 旅遊規劃(25 分)

題目來源:中國大學MOOC-陳越、何欽銘-資料結構-2018春
作者: 陳越
單位: 浙江大學
問題描述:
有了一張自駕旅遊路線圖,你會知道城市間的高速公路長度、以及該公路要收取的過路費。現在需要你寫一個程式,幫助前來諮詢的遊客找一條出發地和目的地之間的最短路徑。如果有若干條路徑都是最短的,那麼需要輸出最便宜的一條路徑。
輸入格式:
輸入說明:輸入資料的第1行給出4個正整數N、M、S、D,其中N(2≤N≤500)是城市的個數,順便假設城市的編號為0~(N−1);M是高速公路的條數;S是出發地的城市編號;D是目的地的城市編號。隨後的M行中,每行給出一條高速公路的資訊,分別是:城市1、城市2、高速公路長度、收費額,中間用空格分開,數字均為整數且不超過500。輸入保證解的存在。
輸出格式:
在一行裡輸出路徑的長度和收費總額,數字間以空格分隔,輸出結尾不能有多餘空格。
輸入樣例:
4 5 0 3
0 1 1 20
1 3 2 30
0 3 4 10
0 2 2 20
2 3 1 20
輸出樣例:
3 40

解答:一道簡單的迪傑斯特拉的應用,要注意存在相等路徑長度時需要再加個價格作為權值做篩選。

#include <iostream>
#include <algorithm>
using namespace std;
const int maxn=500;
const int INF=501;
int G[maxn][maxn];
int Weight[maxn][maxn];
int N,M,S,D;
int dis[maxn];
bool isVisited[maxn];
int weightCost[maxn];
void dijastra(int start)
{
    dis[start]=0
; while(1) { int minLen=INF; for(int i=0;i<N;i++) { if(dis[i]<minLen&&isVisited[i]==0) { start=i; minLen=dis[i]; } } if(minLen==INF) break; isVisited[start]=1
; for(int i=0;i<N;i++) { if(isVisited[i]==0) { if(dis[start]+G[start][i]<dis[i]) { dis[i]=dis[start]+G[start][i]; weightCost[i]=weightCost[start]+Weight[start][i]; } else if(dis[start]+G[start][i]==dis[i]&&weightCost[start]+Weight[start][i]<weightCost[i]) { weightCost[i]=weightCost[start]+Weight[start][i]; } } } } } int main() { fill(G[0],G[0]+maxn*maxn,INF); fill(Weight[0],Weight[0]+maxn*maxn,INF); fill(dis,dis+maxn,INF); fill(isVisited,isVisited+maxn,0); cin>>N>>M>>S>>D; for(int i=0;i<M;i++) { int s,d,l,m; cin>>s>>d>>l>>m; G[s][d]=G[d][s]=l; Weight[s][d]=Weight[d][s]=m; } dijastra(S); cout<<dis[D]<<" "<<weightCost[D]; return 0; }