1261:【例9.5】城市交通路网
时
【题目描述】
下图表示城市之间的交通路网,线段上的数字表示费用,单向通行由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
//不好理解,参照他人经验。行是城,列也是城,交点有数是相通的城市,0就是不通
//第一行是城1,第一列也是城1……第一行与第二列交点是城1到城2的city[1][2]
//f[i]是到终点的最短路径,road[i]记录城市号 从终点到起点来推
#include<bits/stdc++.h>
using namespace std;
int m,n,f[1005],city[101][101],road[1005];
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
scanf("%d",&city[i][j]);
f[j]=0x3e3e3e;
}
f[n]=0;//n到n是0;
for(int i=n-1;i>=1;i--)
for(int j=i+1;j<=n;j++)//j是i的下一个,已计算出到e城的最短
if(city[i][j]&&f[i]>f[j]+city[i][j])//不是0,并且当前最短大于上一个最短加上j城的路
{
f[i]=f[j]+city[i][j];
road[i]=j;//记城市
}
cout<<"minlong="<<f[1]<<endl;
m=1;//从城市1开始
while(m)
{
cout<<m<<" ";
m=road[m];
}
return 0;
}