欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

信息学奥赛一本通 1261:城市交通路网(evd)

程序员文章站 2022-07-14 21:38:40
...

【题目描述】
下图表示城市之间的交通路网,线段上的数字表示费用,单向通行由A->E。试用动态规划的最优化原理求出A->E的最省费用。
信息学奥赛一本通 1261:城市交通路网(evd)

如图:求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
【心得】挖地雷是取最大,该题只是取最小!而且起点就是1,简不简单!
【AC代码】

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
const int N=105;
const int IMAX=9999;
int a[N][N],c[N],f[N];
int main()
{
	int n,x;
	cin>>n;
	for(int i=1;i<=n;i++) 
	{
		f[i]=IMAX;
		for(int j=1;j<=n;j++) cin>>a[i][j];
	}
	f[n]=0;
	for(int i=n-1;i>=1;i--)
	{
		for(int j=i+1;j<=n;j++)
		{
			if(a[i][j]&&f[j]+a[i][j]<f[i])
			{
				f[i]=f[j]+a[i][j];
				c[i]=j;
			}
		}
	}
	cout<<"minlong="<<f[1]<<endl;
	x=1;
	while(c[x])
	{
		cout<<x<<' ';
		x=c[x];
	}
	cout<<x;
	return 0;
}

相关标签: 经验 动态规划