1261:【例9.5】城市交通路網
時間限制: 1000 ms 內存限制: 65536 KB
【題目描述】
下圖表示城市之間的交通路網,線段上的數字表示費用,單向通行由A->E。試用動態規劃的最優化原理求出A->E的最省費用。
如圖:求v1到v10的最短路徑長度及最短路徑。
【輸入】
第一行爲城市的數量N;
後面是N*N的表示兩個城市間費用組成的矩陣。
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
【輸出】
A->E的最省費用。
minlong=19
1 3 5 8 10
思路:設dp[i][1]=N,表示第i個城市到第1個城市距離邊界爲N然後從第i個城市開始,對於每個城市每次都遍歷所有的點,然後更新距離設dp[i][1]表示第i個城市到第1個城市距離最短時經過的下一個城市然後輸出就好了。dp[n][1] 存最短路徑.
#include<cstdio>
#include<iostream>
using namespace std;
const int N = 1000 + 10;
int a[N][N],n,dp[N][3];
int k[N];
void find(int k) //輸出入過的各個城市
{
if(k != 1)
find(dp[k][2]);
cout << k <<' ';
}
int main(){
cin >> n;
for(int i = 1 ; i <= n; i++)
for(int j = 1; j <= n;j++)
cin >> a[i][j]; //打印表
for(int i = 2;i <= n;i++)
dp[i][1] = N; //DP邊界
k[1] = 1;
//計算最短路徑
for(int i = 2 ; i <= n ;i++) //第二個城市開始循環
{
for(int j = 1 ; j < n; j++)
{
if(a[j][i] != 0) //表示j到i存在通路
{
if(dp[i][1] > dp[j][1] + a[j][i])
{
dp[i][1] = a[j][i] + dp[j][1]; //城市i 到終點最短距離
dp[i][2] = j;
}
}
}
}
printf("minlong=%d\n",dp[n][1]);
find(dp[n][2]);
cout << n << endl;
return 0;
}