对最长路(和最短路)的一些思考

为了使得整篇文章显得更加人性化,咱们首先说一下最短路。
声明:不是讲解知识点不是讲解知识点不是讲解知识点不是讲解知识点不是讲解知识点,整篇文章建立在默认已经会的基础之上,然后提出一些个人见解。

最短路

此时的 SPFA 显得不再重要了(,咱们进入正题,说一下 dijkstra。
(堆优化的)迪杰的本质是贪心,他依赖于一种叫“最优子结构”的东西(其实就是贪心常说的局部最优达到全局最优),首先观察一下代码:

inline void dij (int x) {priority_queue < pair < int ,int > > q ;memset (dis ,0x3f ,sizeof dis) ;dis[x] = 0 ;q.push (make_pair (0 ,x)) ;while (! q.empty ()) {int cur = q.top ().second ;q.pop () ;if (vis[cur]) continue ;vis[cur] = true ;for (int i = head[cur] ;i ;i = e[i].nxt) {int nex = e[i].to ;if (dis[nex] > dis[cur] + e[i].val) {dis[nex] = dis[cur] + e[i].val ;q.push (make_pair (-dis[nex] ,nex)) ;}}} 
}

这份代码看起来并不那么可靠,所以我制作了一张简单图:

假设我们已经知道了 \(1\rightarrow2\rightarrow4\) 的距离是 \(2\),也就是 \(dis_4=2\),然后我们发现 \(4\) 在堆里的位置比 \(3\) 靠前(也就是说其实我们还没有用 \(3\) 去查看 \(4\)),但是我们仍然可以直接用 \(dis_4\) 去更新其他的点,为什么?注意到全都是正边,因为 \(1\rightarrow2\rightarrow4\) 已经短于 \(1\rightarrow3\) 了,所以无论 ? 是多少,\(1\rightarrow3\rightarrow4\) 肯定不会更短,也就是说我们完全没有必要等到 \(3\) 的时候在再用 \(4\) 更新别人。
也就是说 dij 选择性忽略了“还没枚举到的点”的情况
这也解释了为什么 dij 不支持负边权,因为如果可以是负数那么我们的贪心策略就不再正确。
同时也解释了为什么不能跑最长路,因为(比如)\(1\rightarrow2\rightarrow4\) 已知的比 \(1\rightarrow3\) 长(我们还没有遍历到 \(3\)),但是这并不代表 \(1\rightarrow3\rightarrow4\) 一定比已知的 \(1\rightarrow2\rightarrow4\) 短,所以我们不可以这个时候更新。
但是如果原图全是负边求最长路你全都取反跑最短路也不是不行(。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/790252.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

闲话 831

非常厉害治程宝典看不下去了😭 被分析卡脖子了 还是来看看合订本吧家人们 初 见 端 倪灵 光 一 闪渐 入 佳 境炉 火 纯 青登 峰 造 极羽 化 成 仙完 全 胜 利YJX AK IOI

LTSPICE include导入模型

以mos为例: 1、include lib 命令输入.include,放入原理图后右键,导入模型2,首先加入一个mos按住ctrl,右键mos spicemodel输入型号,prefix输入X,Value可不填。 设置好之后就可以开始仿真了。

ZS审判日(一):8月28日测试

前言:附高是不要的,省实验是上不了的,历二是考不上的。节选一些唐题。 第一场:语文(7:50-9:50) 1 题面 请你仿照示例,写出一个四个字分别为一二三四声的四字短语。 例:中流砥柱 分析 & 评价 试卷后面有一个词 经营惨淡 可以写。(但是我没看到) 此题小唐。 2 题面…

实现阶乘的几种方式:递归、迭代、内置函数

0! = 1,阶乘的参数不能为负数,必须大于等于0;

esp32-idf

一、找不到头文件 设置文件位置环境变量:

手把手教你使用C语言实现堆栈数据结构算法-两种方式(链表+数组)

我用C语言数组和链表手写了一个数据结构----栈堆栈 定义 栈(stack) 是一种遵循先入后出逻辑的线性数据结构,常见操作入栈,出栈,访问栈图片来源:https://www.hello-algo.com/ 栈的实现 栈遵循先入后出的原则,因此我们只能在栈顶添加或删除元素。然而,数组和链表都可以在任…

全国大学高校专业数据 API 接口

全国大学高校专业数据 API 接口 提供大学专业基础数据,持续更新,各类专业属性。1. 产品功能2023 年数据已更新; 提供最新的全国高校专业基本信息; 总计近 3000 条专业精准基础数据; 每月一次数据更新校正; 同时包含了专业开设课程列表; 全接口支持 HTTPS(TLS v1.0 / v1…

网页可读内容抽取 API 数据接口

网页可读内容抽取 API 数据接口 智能提取文章关键元素信息,智能抽取,多种元素信息。1. 产品功能智能提取网页可阅读内容; 提供网页可阅读内容的 HTML 代码; 支持传递网页 HTML 或网页 URL 参数; 支持多种元素信息抽取,包括文章标题、作者、文字方向、语言、内容、内容(不…

9 张图总结 MySQL 架构

原文:9 张图总结一下 MySQL 架构前言 目前大部分的后端开发人员对MySQL的理解可能停留在一个黑盒子阶段。 对MySQL基本使用没什么问题,比如建库、建表、建索引,执行各种增删改查。 所有很多后端开发人员眼中的MySQL如下图所示:导致在实际工作中碰到MySQL中死锁异常、SQL性能…

The 1st Universal Cup. Stage 8: Slovenia

Preface 这场其实是昨天打的,但因为今天没训练就摆烂拖到今天才补题和写博客 这场题感觉都挺可做的,但前期出题有点慢导致后期没时间了,徐神和祁神赛后 20min 过了 J 有点可惜A. Bandits 题都没看,不做评价B. Combination Locks 不难发现这题本质就是在 0/1 串上操作,每次…

梁山县技工学校继续教育刷课脚本-JavaScript编写

脚本 学习网站:lsx.qzjystudy.com 脚本地址:梁山县技工学校继续教育-刷课脚本 教程 1.插件安装(以Microsoft Edge浏览器为例)打开最中间那个蓝色绿色的浏览器,谷歌之类的浏览器也可以点击屏幕右上角三个点,图示位置,然后点击扩展点击获取扩展搜索Tampermonkey,并点击获取…