【SSL】城市交通

城市交通


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

解题思路

使用动态规划,状态转移方程是:
f[i][j]+=s[j]f[i][j]+=s[j]f[i][j]+=s[j]
s[i]=min(s[i][j],s[i])s[i]=min(s[i][j],s[i])s[i]=min(s[i][j],s[i])
我的程序使用的是逆推法,但前提是s[i][j]!=0,也可以用顺推。

#include<stdio.h> 
#include<iostream>
using namespace std;
long long n,s[1000][1000],f[1000];
void input()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			scanf("%d",&s[i][j]);
		}
	}
}
void work()
{
	f[n]=0;
	for(int i=n-1;i>0;i--)
	{
		f[i]=100000;
		for(int j=i+1;j<=n;j++)
		{
			if(s[i][j]==0)//判断是否等于零
			continue;
			s[i][j]+=f[j];
			f[i]=min(s[i][j],f[i]);//状态转移方程
		}
	}cout<<f[1];//输出
}
int main()
{
	input();
	work();
    return 0;
} 
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值