第九章 动态规划-1261:【例9.5】城市交通路网

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;
}
发布了430 篇原创文章 · 获赞 2 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/zqhf123/article/details/105506540
今日推荐