1261:【例9.5】城市交通路网
时间限制: 1000 ms 内存限制: 65536 KB
提交数: 3909 通过数: 2854
【题目描述】
下图表示城市之间的交通路网,线段上的数字表示费用,单向通行由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 到 v10 的最短路径长度则f[10] =0
f[i] =min{a[i][x]+f[x],当a[i][x]>0,i<x<=n时}
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 100
#define INF 0X3F3F3F3F
int a[maxn][maxn];
int f[maxn];
int pre[maxn];
using namespace std;
int main(){
int n;
cin>>n;
memset(a,0,sizeof(a));
memset(pre,0,sizeof(pre));
for(int i = 1 ;i <= n; i++) //输出各城市之间距离
for(int j = 1; j <= n; j++)
scanf("%d", &a[i][j]);
for(int i = 1; i <= maxn; i++)
f[i] = INF;//默认初值都是0X3F3F3F3F
f[n] = 0;
for(int i = n-1 ;i >=1;i--)//从终点往前逆推,计算最短路径
for(int j= i+1;j <= n;j++)
{
if(a[i][j] > 0 && f[j] != INF && f[i] >a[i][j] + f[j])//INF表x->终点城市不通
{
f[i] = f[j] + a[i][j];//城市i到终点最短路径值
pre[i] = j;
}
}
printf("minlong = %d\n",f[1]);//输出最短路径值
int k = 1;
while(k != 0)//输出路过的各个城市
{
printf("%d ",k);
k = pre[k];
}
printf("\n");
return 0;
}