【例9.5】城市交通路網
阿新 • • 發佈:2017-10-05
out gif int cout size 試用 優化 cin namespace
時間限制: 1000 ms 內存限制: 65536 KB
【例9.5】城市交通路網
鏈接:http://ybt.ssoier.cn:8088/problem_show.php?pid=1261
時間限制: 1000 ms 內存限制: 65536 KB
【題目描述】
下圖表示城市之間的交通路網,線段上的數字表示費用,單向通行由A->E。試用動態規劃的最優化原理求出A->E的最省費用。
如圖:求v1到v10的最短路徑長度及最短路徑。
【輸入】
第一行為城市的數量N;
後面是N*N的表示兩個城市間費用組成的矩陣。
【輸出】
A->E的最省費用。
【輸入樣例】
10 0 2 5 1 0 0 0 0 0 0 0 0 0 0 12 14 0 0 0 0 0 0 0 0 6 10 4 0 0 0 0 0 0 0 13 12 11 0 0 0 0 0 0 0 0 0 0 3 9 0 0 0 0 0 0 0 0 6 5 0 0 0 0 0 0 0 0 0 10 0 0 0 0 0 0 0 0 0 0 5 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0
【輸出樣例】
minlong=19 1 3 5 8 10
題解:f[i]表示第i個城市到終點的最短距離
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int mp[105][105],f[105],a[105]; const int maxn=10000005; int main() { int n; cin>>n; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) cin>>mp[i][j]; for(int i=1;i<=n;i++)f[i]=maxn; f[n]=0;a[n]=0; for(int i=n-1;i>0;i--) for(int j=i+1;j<=n;j++) if(mp[i][j]&&mp[i][j]+f[j]<f[i]) { f[i]=mp[i][j]+f[j]; a[i]=j; } cout<<"minlong="<<f[1]<<endl; int k=1; printf("1"); while(k) { if(k!=1)printf(" %d",k); k=a[k]; } }
【例9.5】城市交通路網