1. 程式人生 > >【例9.5】城市交通路網

【例9.5】城市交通路網

out gif int cout size 試用 優化 cin namespace

【例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】城市交通路網