当前位置: 首页 > news >正文

8.城市交通

有n个城市,编号1~n,有些城市之间有路相连,有些则没有,有路则会有一个距离。如图所示是一个含有11个城市的交通图,连线上的数表示距离。现在规定只能从编号小的城市到编号大的城市。问:从编号为1的城市到编号为n的城市的最短距离是多少?

输入:

第一行为n,表示城市数,n<=100。

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

输出:

输出一个数,表示最短距离,保证有解。

输入示例:

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

输出示例:
13

解题思路:

1.首先,第一个解决的问题便是如何从矩阵中获取到两个城市之间的距离,如果从i到j可以通路的话,那么map【i】【j】是不为0的,题目中所说只能从编号小的城市到编号大的城市走

2.分析,该用什么方法求解呢?如果到到达城市11,那么只能从8,9,10这三座城市到达,那么只要直到了到达这三座城市的最短路线,然后加上到11的路线,选取三个和中的最小值那么便是最优解,如何求解到达8,9,10这三座城市的最短路线呢?又回到了这个问题,那么看看哪些城市能到达这三座城市,然后同样的方法,保存最优解即可

3.这样分析,满足了最优解包含最优子结构,并且无后效性(无后效性具体指:现在做的事不会影响过去,并且未来做的事不会影响到现在),我们只需要求得到达每一座城市的最短距离,然后求解下一阶段即可

4.设置状态:dp【i】表示从城市1到城市i的最短距离

5.状态转移:从比i号城市小的城市编号中依次遍历,如果这两个城市有路的话,那么就在dp[i]和dp[j]+map[i][j]中选择最小值,即dp[i]=min(dp[i],dp[j]+map[i,j]);

       说明:为什么是在dp[i]和dp[j]+a[i][j]中选最小值,拿城市11距离,可以到达的城市为8,9,10,首先肯定先判断城市8+a[11][8],因为dp[11]是一个很大的数,选择最小值必然会被取代,那么接下来判断城市9-11,此时的dp[11]已经更新,所以是在拿8-11的距离和9-11的距离在选最小值!

6.初始状态:既然要选择最小值的话,那么dp中的最短路初始化为一个很大的数,dp[1]=0,表示从城市1到城市1的距离为0;

7.求目标值dp[n]


#include<bits/stdc++.h>
using namespace std;
int a[105][105],dp[105];
const int MAX=999999999;
int main()
{
	int n;
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		cin>>a[i][j];
	}//输入数据 
	
	for(int i=2;i<=n;i++)
	dp[i]=MAX;//设置初始状态 
	
	for(int i=2;i<=n;i++)//递推求解到达每一个城市的最短路 
	{
		for(int j=1;j<i;j++)//枚举可以到达i城市的城市 
		{
			if(a[i][j]!=0)//如果这两个城市有路 
			dp[i]=min(dp[i],dp[j]+a[i][j]);//选取最小值更新 
		}
	}
	cout<<dp[n];//输出目标值 
	return 0;
}

相关文章:

  • 软件流程和管理(六):Project Scheduling
  • 2022-09-01 mysql/stonedb-多线程并行遍历元组遇到的问题分析
  • MATLAB | 面积图、饼状图、水平柱状图的斜线填充(阴影填充)
  • IDEA开发环境初始化配置
  • 企业单位公众号如何上传附件(如Word,Excel,PPT等)
  • Java中二维数组练习题
  • 一步到位,在Ubuntu中开启MySQL Windows Navicat能远程访问
  • 关于 Math.random()生成指定范围内的随机数的公式推导
  • 抛砖系列之git仓库拆分工具git-filter-repo
  • 基于51单片机温度监控Proteus仿真设计_报警值可调
  • 海关 瑞数5.5 找后缀加密入口解析
  • Cadence OrCAD Capture 绘制总线的方法
  • 高薪程序员面试题精讲系列145之前后端如何交互?Swagger你用过吗?
  • MySQL高级十:索引
  • 8月更新| Java on Visual Studio Code
  • HTML-表单
  • iOS小技巧之UIImagePickerController实现头像选择
  • Js基础知识(四) - js运行原理与机制
  • leetcode讲解--894. All Possible Full Binary Trees
  • node-glob通配符
  • Spring Cloud Alibaba迁移指南(一):一行代码从 Hystrix 迁移到 Sentinel
  • vue-router的history模式发布配置
  • 从0到1:PostCSS 插件开发最佳实践
  • 飞驰在Mesos的涡轮引擎上
  • 基于Javascript, Springboot的管理系统报表查询页面代码设计
  • 基于Mobx的多页面小程序的全局共享状态管理实践
  • 记一次用 NodeJs 实现模拟登录的思路
  • 译有关态射的一切
  • #pragma data_seg 共享数据区(转)
  • $GOPATH/go.mod exists but should not goland
  • (html转换)StringEscapeUtils类的转义与反转义方法
  • (Java)【深基9.例1】选举学生会
  • (Redis使用系列) Springboot 使用Redis+Session实现Session共享 ,简单的单点登录 五
  • (ZT)出版业改革:该死的死,该生的生
  • (二)构建dubbo分布式平台-平台功能导图
  • (四)Tiki-taka算法(TTA)求解无人机三维路径规划研究(MATLAB)
  • (四)搭建容器云管理平台笔记—安装ETCD(不使用证书)
  • (转载)微软数据挖掘算法:Microsoft 时序算法(5)
  • ******IT公司面试题汇总+优秀技术博客汇总
  • .dwp和.webpart的区别
  • .Net - 类的介绍
  • .NET Core SkiaSharp 替代 System.Drawing.Common 的一些用法
  • .NET MVC第五章、模型绑定获取表单数据
  • .NET/ASP.NETMVC 大型站点架构设计—迁移Model元数据设置项(自定义元数据提供程序)...
  • .net对接阿里云CSB服务
  • .NET开源全面方便的第三方登录组件集合 - MrHuo.OAuth
  • ::
  • @Autowired注解的实现原理
  • [ IO.File ] FileSystemWatcher
  • [8-27]正则表达式、扩展表达式以及相关实战
  • [bzoj 3534][Sdoi2014] 重建
  • [C++]——带你学习类和对象
  • [Django 0-1] Core.Handlers 模块
  • [HDU] 1054 Strategic Game 入门树形DP
  • [IE9] GPU硬件加速到底是实用创新还是噱头