城市交通【DP】

> Description

有n个城市,编号1~n,有些城市之间有路相连,有些则没有,有路则当然有一个距离。现在规定只能从编号小的城市到编号大的城市,问你从编号为1的城市到编号为n的城市之间的最短距离是多少?


> Input

先输入一个n,表示城市数,n小于100。
下面的n行是一个n*n的邻接矩阵map[i,j],其中map[i,j]=0表示城市i和城市j之间没有路相连,否则为两者之间的距离。


> Output

输出格式:一个数,表示最少要多少时间。
输入数据保证可以从城市1飞到城市n。


> Sample Input

11
0 5 3 0 0 0 0 0 0 0 0
5 0 0 1 6 3 0 0 0 0 0
3 0 0 0 8 0 4 0 0 0 0
0 1 0 0 0 0 0 5 6 0 0
0 6 8 0 0 0 0 5 0 0 0
0 3 0 0 0 0 0 0 0 8 0
0 0 4 0 0 0 0 0 0 3 0
0 0 0 5 5 0 0 0 0 0 3
0 0 0 6 0 0 0 0 0 0 4
0 0 0 0 0 8 3 0 0 0 3
0 0 0 0 0 0 0 3 4 3 0
在这里插入图片描述


> Sample Output
13


> 解题思路
这一题用动态优化解。


> 代码

#include<iostream>
#include<cstdio>
using namespace std;
int a,f[101],n;
//a用来存2~n+1行的每一个数,f累加
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			cin>>a;
			if(a!=0)//当编号i可以到达编号j
			 if(a+f[i]<f[j]||f[j]==0)//从这里到j的距离更短或者f[j]还未存数
			  f[j]=a+f[i];//累加
		}
	}
	printf("%d",f[n]);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_43010386/article/details/82791386