7-9 旅遊規劃 (25 分)+dijkstra模板
阿新 • • 發佈:2019-01-05
有了一張自駕旅遊路線圖,你會知道城市間的高速公路長度、以及該公路要收取的過路費。現在需要你寫一個程式,幫助前來諮詢的遊客找一條出發地和目的地之間的最短路徑。如果有若干條路徑都是最短的,那麼需要輸出最便宜的一條路徑。
輸入格式:
輸入說明:輸入資料的第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> #include <cstdio> #include <vector> #include <stack> #include <queue> #include <cmath> using namespace std; const int maxn=510; const int inf=999999; int n,m,s,d; vector<int> pre[maxn]; vector<int> path,temppath; int dis[maxn],e[maxn][maxn],cost[maxn][maxn]; bool visit[maxn]; int mincost=inf; void dfs(int v){ if(v==s){ temppath.push_back(v); int tempcost=0; for(int i=temppath.size()-1;i>0;i--){ int id=temppath[i],nextid=temppath[i-1]; tempcost+=cost[id][nextid]; } if(tempcost<mincost){ mincost=tempcost; path=temppath; } temppath.pop_back(); return; } temppath.push_back(v); for(int i=0;i<pre[v].size();i++) dfs(pre[v][i]); temppath.pop_back(); } int main() { fill(dis,dis+maxn,inf); fill(e[0],e[0]+maxn*maxn,inf); cin>>n>>m>>s>>d; for(int i=0;i<m;i++){ int a,b,c,cos; cin>>a>>b>>c>>cos; e[a][b]=e[b][a]=c; cost[a][b]=cost[b][a]=cos; } for(int i=0;i<n;i++) pre[i].push_back(i); dis[s]=0; for(int i=0;i<n;i++){ int u=-1,minn=inf; for(int j=0;j<n;j++){ if(visit[j]==false&&dis[j]<minn){ u=j; minn=dis[j]; } } if(u==-1) break; visit[u]=true; for(int v=0;v<n;v++){ if(visit[v]==false&&e[u][v]!=inf){ if(dis[u]+e[u][v]<dis[v]){ dis[v]=dis[u]+e[u][v]; pre[v].clear(); pre[v].push_back(u); }else if(dis[u]+e[u][v]==dis[v]){ pre[v].push_back(u); } } } } dfs(d); cout<<dis[d]<<" "<<mincost; return 0; }