算法训练 最短路

2023-05-16

算法训练 最短路

问题描述
给定一个n个顶点,m条边的有向图(其中某些边权可能为负,但保证没有负环)。请你计算从1号点到其他点的最短路(顶点从1到n编号)。

输入格式
第一行两个整数n, m。

接下来的m行,每行有三个整数u, v, l,表示u到v有一条长度为l的边。

输出格式
共n-1行,第i行表示1号点到i+1号点的最短路。
样例输入
3 3
1 2 -1
2 3 -1
3 1 2
样例输出
-1
-2
数据规模与约定
对于10%的数据,n = 2,m = 2。

对于30%的数据,n <= 5,m <= 10。

对于100%的数据,1 <= n <= 20000,1 <= m <= 200000,-10000 <= l <= 10000,保证从任意顶点都能到达其他所有顶点。

很明确,题目告知有负权,Dijkstra算法处理不了,所以立马舍弃,至于Floyd数据量太大,适用于小型测试用例,现在能使用的就只有Bellman-Ford 和队列优化的Bellman-Ford算法。先附上Bellman-Ford代码,此算法也是优化过一点点的,具体优化方案是因为Bellman算法执行到一定程度时,就已经将全部的最短路径求出来了,我们只需要找到dis数组(储存最短路径数组)不变的时候,说明最短路径已经全部求出,算法已经可以退出了。
Bellman-Ford

#include<stdio.h> 
#include<string.h>
int main(){
	int dis[20005],bak[20005],u[200005],v[200005],w[200005];//bak数组用来验证最短路径是否全部算完
	int i,j,a,b,c,n,m,check=0;
	scanf("%d%d",&n,&m);
	for(i=1;i<=m;i++){
		scanf("%d%d%d",&u[i],&v[i],&w[i]);
	} 
	memset(dis,999999,sizeof dis);
	dis[1]=0;  //将一号顶点置为0
	//核心算法
	for(i=1;i<=n-1;i++){
		for(i=1;i<=n;i++) bak[i]=dis[i];
		for(j=1;j<=m;j++){
			if(dis[v[j]]>dis[u[j]]+w[j]){  //1号顶点到v[j]顶点的路径 > 1号顶点到u[j]的距离 + v[j]到u[j]边的权值
				dis[v[j]]=dis[u[j]]+w[j]; 
			}
		}
		check=0;
		for(i=1;i<=n;i++) 
			//只要有不相等的说明最短路径还没算完,退出验证的循环
			if(bak[i]!=dis[i]){
				check=1;
				break;
			}
		if(check==0) break;//最短路径全部算完,退出核心算法循环
	}
	for(i=2;i<=n;i++) printf("%d\n",dis[i]);
	return 0;

}

刚开始提交的时候把dis初始化成10001了,u v w 也只给了20005的大小,只对了80%,最后尝试改了一下,没想到还全对了,哈哈哈!!!以此鼓励。

Bellman-Ford队列优化

#include<stdio.h> 
int main(){
	int i,j,n,m,k,head=1,tail=1;
	scanf("%d%d",&n,&m);
	int dis[n+1],u[m+1],v[m+1],w[m+1],first[n+1],next[m+1],book[n+1]; 
	//book: 储存那些元素用了  first 、next : 数组实现邻接表   dis: 储存最短路径
	int que[200005]={0};
	//que:队列 用处就是减少了运算的次数  已经算出最短路径的确定值 就没有必要再算了 置为1
	//初始化
	for(i=1;i<=n;i++){
		book[i]=0;
		dis[i]=999999;
		first[i]=-1;
	}
	for(i=1;i<=m;i++){
		scanf("%d%d%d",&u[i],&v[i],&w[i]);
		//数组实现的邻接表  核心代码
		next[i]=first[u[i]];
		first[u[i]]=i;
	}
	//1号顶点到自己的路径当然是0啦
	dis[1]=0;
	//一号顶点入队 
	que[tail]=1; tail++;
	book[1]=1;
	//队列中有元素才进循环
	while(head<tail){
		//取队头的第一个元素 然后再从first数组找到所储存的顶点
		k=first[que[head]];
		while(k!=-1){
			if(dis[v[k]]>dis[u[k]]+w[k]){
			
				dis[v[k]]=dis[u[k]]+w[k]; 
				
				if(book[v[k]]==0){
					book[v[k]]=1;
					que[tail]=v[k];
					tail++;
				}
			}
			k=next[k];  //从next中找到相连的顶点 这个顶点是first[que[head]]的下一个顶点 
							  //好比1->3这样子 3就是1的下一个顶点
		}
		//这里还要把处理队头的顶点置为0,因为很有可能这个顶点还会再次入队
		book[que[head]]=0;
		//出队
		head++;
	} 
	
	for(i=2;i<=n;i++) printf("%d\n",dis[i]);
	return 0;

}

弄懂了原理,还是要多做题才能理解的更深刻,毕竟容易忘掉一些细节。

加油啊!!…

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

算法训练 最短路 的相关文章

  • 基于OpenCV的轮廓检测(1)

    1 目标 理解什么叫做轮廓学习如何寻找轮廓以及可视化轮廓找出轮廓的不同特征 xff0c 如面积 周长 质心 边框等将看到许多与轮廓相关的函数 2 什么叫做轮廓 轮廓可以简单地解释为连接所有连续点 xff08 沿着边界 xff09 的曲线 x
  • 自动驾驶数据标注技术:如何解决数据标注难题?

    自动驾驶数据标注技术是现代自动驾驶汽车发展过程中必不可少的一部分 xff0c 因为它能够提高自动驾驶汽车的性能 xff0c 确保其安全性和准确性 然而 xff0c 数据标注的难题也给自动驾驶汽车的发展带来了挑战 下面是关于自动驾驶数据标注技
  • 在mac m1上安装docker并在浏览器启动Ubuntu环境

    目录 一些前言 xff08 说明我要这样做的原因 xff0c 很啰嗦 xff0c 建议直接跳过 xff09 安装docker用docker启动ubuntu的环境在ubuntu中安装qt5qt5bug解决qt5卸载 一些前言 xff08 说明
  • 【3D打印机】原来配置Marlin2.0这么简单,别说我没告诉你。

    96 96 可能由于各人的打印机款式不同 xff0c 某些参数没有出现在文中 xff0c 但是只要你完全看完本指南 xff0c 就可以理解Marlin是如何工作的 xff0c 我相信在此基础上 xff0c 你在固件中找到哪些不同配置并不困难
  • Ubuntu18.0 PX4+ROS+MAVROS+Gazebo仿真环境搭建

    Ubuntu18 0 PX4 43 ROS 43 MAVROS 43 Gazebo仿真环境搭建 PX4 xff1a 更新git 连接VPN下载安装 xff0c https docs px4 io master en dev setup bu
  • PX4 APM ROS MAVROS Gazebo之间关系

    https www cnblogs com yilangUAV p 14476923 html 1 PX4与APM 参考 https bbs amovlab com forum php mod 61 viewthread amp tid 6
  • MAVROS机外(offboard)控制例程

    PX4与ROS各部分的关系 Simulator仿真器 xff08 Gazebo xff09 xff1a 模拟真实飞行 xff0c 即模拟计算出真实飞行时的传感器状态 xff0c 包括GPS xff0c IMU xff08 惯性测量单元 xf
  • 罗素“杀死了”康托尔

    英国数学家罗素提出的著名的 罗素悖论 xff0c 直接证明了作为数学大厦基础的 集合论 是有问题的 xff0c 这也导致了 集合论 的发现者康托尔一次又一次的经历着罗素的劫难却也解决不了这个问题 xff0c 最终死在了自己工作的哈佛大学精神
  • px4与gazebo的多无人机编队仿真 offboard模式

    转载 原文链接 xff1a https blog csdn net weixin 43409270 article details 114703341 多机仿真 1 修改launch文件 在 PX4 Autopilot launch目录下
  • ubuntu18.04的APM环境搭建过程

    ubuntu18 04的APM环境搭建过程 配置APM环境结合gazebo软件进行仿真Ardupilot之Mavros实现Ros节点控制 配置APM环境 官方文档 https ardupilot org dev docs building
  • 使用Dronekit控制无人机,DroneKit配置

    DroneKit Python是一个用于控制无人机的Python库 DroneKit提供了用于控制无人机的API xff0c 其代码独立于飞控 xff0c 单独运行在机载电脑 xff08 Companion Computer xff09 或
  • [pixhawk笔记]-飞行模式

    pixhawk笔记 飞行模式 参考 xff1a https www cnblogs com spyplus p 7351690 html 本文翻译自px4官方开发文档 xff1a https dev px4 io en concept fl
  • 常见网络摄像机的端口及RTSP地址

    之前用opencv抓视频流搞了很久 xff0c 终于找到一篇比较靠谱的文章 亲测雄迈ip摄像头有效 海康威视 默认IP地址 xff1a 192 168 1 64 DHCP 用户名admin 密码自己设 端口 xff1a HTTP 端口 xf
  • Vue i18n学习记录

    昨天接触到了Vue i18n国际化 先去搜索了官网 都看了一遍有个大致印象以后发现 不知道把他的列子写在哪里 xff08 我想找个视频教程都没得 xff09 就是像下面这个图一样 你到底是放在哪里的 xff1f xff1f xff1f xf
  • Vue项目i18n国际化语言切换

    1 安装依赖 npm install vue i18n 2 在目录下创建所需文件 目录结构 在main js中引入 import Vue from 39 vue 39 import App from 39 App vue 39 import
  • 噔噔噔噔~冒泡排序算法

    冒泡排序算法 冒泡排序算法原理 xff1a 1 比较相邻的元素 如果第一个比第二个大 xff0c 就交换他们两个 2 对每一对相邻元素作同样的工作 xff0c 从开始第一对到结尾的最后一对 最后的元素会是最大的数 3 针对所有的元素重复以上
  • 微信小程序Map组件全屏显示

    微信小程序Map组件全屏显示 本人今天遇到了这个问题 想要小程序Map组件全屏显示设置css样式height 100 xff1b 是不生效得 需要用单位vh 设置css样式为height 100vh xff1b 就可以了 仅供参考哦
  • vue+vant 实现列表上下排序

    vue 43 vant 实现列表上下排序 span class token operator lt span template span class token operator gt span span class token opera
  • 用VNC实现远程桌面共享(支持Windows, Linux, ...)

    博客已迁到新址 xff0c 请访问Easwy的博客 http easwy com blog 本文链接地址 xff1a http easwy com blog archives linux remote desktop by vnc
  • [Vue warn]: <transition-group> children must be keyed: <div>报错解决

    标题 Vue warn children must be keyed 今天学习了VUE的列表排序过渡 碰见报错 报错之前代码为 xff1a span class token operator lt span transition span

随机推荐

  • 小程序 用vant-weapp van-field输入框获取不到输入值问题(已解决)

    废话不多说直接上代码 主要的解决问题的是 bind blur 61 xxx span class token operator lt span van span class token operator span field value s
  • webstorm手动更新软件

    webstorm手动更新软件 打开软件 xff0c 进入设置settings搜索Updates点击check now按弹出框内容点击 下载更新
  • vue elementUI点击按钮复制表格某列的链接

    vue elementUI点击按钮复制表格某列链接 lt el table data 61 34 gridData 34 size 61 34 mini 34 gt lt el table column type 61 34 selecti
  • vue 列表进行拖拽排序

    文章为记录项目 需引入插件vuedraggable handle 61 34 mover 34 为绑定拖拽图标的类名 xff0c 即可只能在图标上才可拖拽 lt el form item label 61 34 34 gt lt ul cl
  • vue elementui表单验证

    this refs form validateField 39 type 39 只为项目记录 这个代码为对部分表单字段进行校验的方法
  • element ui分开的开始结束日期验证

    废话不多说直接上代码 lt el form v show 61 34 showSearch 34 ref 61 34 queryForm 34 model 61 34 queryParams 34 inline 61 34 true 34
  • ant.design pro表格序号自定义,翻页也可按顺序来

    title 39 序号 39 dataIndex 39 index 39 valueType 39 indexBorder 39 width 48 hideInSearch true render text record index 61
  • ant.design pro 发布时间对应两个参数值

    title 39 时间 39 dataIndex 39 deployTime 39 valueType 39 dateRange 39 hideInSearch false render record 61 gt lt span gt re
  • 微信小程序图片水印添加

    js getCanvasOne url var mycenter 61 0 文字左右居中显示 var myheight 61 0 文字高度 const that 61 this const query 61 wx createSelecto
  • anaconda出现CondaHTTPError问题解决办法

    一 condarc xff08 conda 配置文件 xff09 Configuration Conda documentation condarc以点开头 xff0c 一般表示 conda 应用程序的配置文件 xff0c 在用户的家目录
  • 使用kalibr标定imu

    这种方法需要在ubuntu中安装matlab 本人只标定的imu 没有和摄像头联合标定 xff0c 方法和imu utils类似 xff0c 先用ros记录imu数据 xff0c 在通过kalibr来计算随机游走误差和高斯白噪声误差 1 首
  • 联合标定双目相机和imu,使用工具Kalibr

    文章目录 imu标定 xff0c 产生数据写入imu yaml中 xff0c 见下文 xff0c imu yaml文件要用于联合标定 双目相机标定 xff0c 产生数据文件用于联合标定 xff0c 文件名类似camchain homeubu
  • matlab从txt文件中提取出有效信息

    背景 从一份txt文件中筛选出有效信息 xff0c txt文件有非常多行 xff0c 依靠关键字筛选出有效行 xff0c 并从行中提取有效信息 test txt文件例如 xff1a aaa 1 2 3 valid 0 1 0 2 0 3 a
  • Python 基础 第一天

    print 34 Hello World 34 print 34 你好 xff0c 世界 34 在 Python 中以单下划线 xff08 xff09 开头命名的标识符 表示不能直接访问的类属性 xff0c 以双下划线 xff08 xff0
  • Python 基础 第二天

    import random import math 集合 xff08 set xff09 是一个无序的不重复元素序列 可以使用 或 set 函数创建集合 值得注意的是 一个空集合必须用set xff0c 使用 创建时会创建一个空字典 bas
  • Django 第六天

    Django高级扩展 静态文件 xff1a css xff0c js xff0c 图片 xff0c Json文件 xff0c 字体文件等 配置settings py xff1a STATICFILES DIRS span class tok
  • Python 爬虫 小练习

    获得某易云音乐 对应歌单下的所有歌曲的歌曲 专辑图片 歌手图片 lrc歌词 span class token keyword import span requests span class token keyword from span b
  • 免费GPU

    中国移动免费GPU资源 九天 毕昇还属于内侧阶段 xff0c 没有充值入口 没有GPU算力的同学可以体验一下 xff0c 不算广告 xff0c 纯属安利羊毛 引言 最近想跑一个模型 xff0c 但突然发现手头没有可用的算力了 然后朋友推荐了
  • 分布式 ROS PX4 GAZEBO 多机仿真 服务器-客户端模式

    这是一个目录 最终目标环境配置要求具体实施方案UAV0配置UAV1配置 执行 最终目标 实现主从机器多机仿真 xff0c 模拟真机部署 具体方案如下 xff1a 设定一台计算机为通信汇集节点 xff0c 处理所有无人机位姿 移动控制等 xf
  • 算法训练 最短路

    算法训练 最短路 问题描述 给定一个n个顶点 xff0c m条边的有向图 xff08 其中某些边权可能为负 xff0c 但保证没有负环 xff09 请你计算从1号点到其他点的最短路 xff08 顶点从1到n编号 xff09 输入格式 第一行