[笔记](更新中)最短路问题的变形

news/2024/11/27 20:10:34/文章来源:https://www.cnblogs.com/Sinktank/p/18572532

\(s\)\(t\)必须经过某个点/某条边的最短路

这个相当板子了,点\(u\)的答案是\(dis(s,u)+dis(u,t)\),边\(e=(u,v)\)的答案是\(\min(dis(s,u)+dis(v,t),dis(s,v)+dis(u,t))+w(e)\)。其中\(dis(u,v)\)表示\(u\)\(v\)的最短路。

\(s\)\(t\)各跑一次Dijkstra,其中\(t\)用反图。预处理出从\(s\)出发和以\(t\)结束的最短路即可。

求最短路数量

P2047 [NOI2007] 社交网络

  • 对于Dijkstra,在松弛时,如果\(d[u]+w=d[i]\),则令\(cnt[i]\leftarrow cnt[i]+cnt[u]\);否则令\(cnt[i]\leftarrow cnt[u]\)
  • 对于Floyd,枚举\(i\)\(j\)的中转点\(k\),如果\(d[i][k]+d[k][j]=d[i][j]\),则令\(cnt[i][j]\leftarrow cnt[i][j]+cnt[i][k]\times cnt[k][j]\);否则令\(cnt[i][j]\leftarrow cnt[i][k]\times cnt[k][j]\)
    • 说明:枚举\(k\)之前的最短路经过的结点都只经过\(1\sim (k-1)\)的点,所以不会重复统计。
Dijkstra 堆优化
struct edge{int to,w;};
vector<edge> G[N];
int d[N],cnt[N];
priority_queue<PII,vector<PII>,greater<PII>> q;
void dijkstra(int s){memset(d,0x3f,sizeof d);memset(cnt,0,sizeof cnt);d[s]=0,cnt[s]=1,q.push({0,s});while(!q.empty()){auto t=q.top();int u=t.second;q.pop();if(t.first>d[u]) continue;for(auto i:G[u]){if(d[u]+i.w==d[i.to])cnt[i.to]+=cnt[u];if(d[u]+i.w<d[i.to]){d[i.to]=d[u]+i.w;q.push({d[i.to],i.to});cnt[i.to]=cnt[u];}}}
}
Floyd
for(int k=1;k<=n;k++)for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)if(f[i][k]+f[k][j]==f[i][j])cnt[i][j]+=cnt[i][k]*cnt[k][j];else if(f[i][k]+f[k][j]<f[i][j])f[i][j]=f[i][k]+f[k][j],cnt[i][j]=cnt[i][k]*cnt[k][j];

求两点间最大边权的最小值

并不是例题:P2245 星际导航
P2245的双倍经验:P1967 [NOIP2013 提高组] 货车运输

P2245的正解是(Kruskal重构树 / 最小生成树) + LCA,这样时间复杂度是\(O(m\log m)+O(n\log n)+O(q\log n)\),每次询问是\(O(\log n)\)的(当然也LCA可以离线求,复杂度上会更优一些)。

上面的题用最短路无法通过,但是在固定起点的情况下,Dijkstra可以做到\(O(m\log m)\)预处理,\(O(1)\)查询;需要任意两点间的答案时,Floyd可以\(O(n^3)\)预处理,\(O(1)\)查询。

  • 对于Dijkstra,重新定义\(f[x]\)为到\(x\)的最大边权的最小值。松弛时,\(f[i]=\min(f[i],\max(f[u],w))\)
    • 初始化时\(f\)设为\(+\infty\)\(f[s]=-\infty\),优先队列按升序。如果是最小边权最大则反过来。
  • 对于Floyd,重新定义\(f[i][j]\)\(i\)\(j\)的最大边权的最小值。转移时\(f[i][j]=\min(\max(f[i][k],f[k][j]))\)
    • 邻接矩阵无边处置为\(+\infty\)。如果是最小边权最大则反过来。

求每个点到最近关键点(可能有多个)的距离

P9432 [NAPC-#1] rStage5 - Hard Conveyors ~ 题解

初始化时,将所有关键点的\(d\)设为\(0\),其他设为\(+\infty\),正常跑Dijkstra即可。

同时,也存在非最短路的线性做法,见上面的题解。

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

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

相关文章

【随手记录】IDEA里面pom文件被忽略,变灰、画横线处理

在setting --> Build -->Build Tools --> Maven 下找到ignored files选项,去掉pom文件的勾选框,重新加载项目即可!

大模型问答的工作流程

从问题输入到输出经历五个步骤文本分词: 大模型会将输入文本转化成单词,词语,词组,符号 分词向量化: 将分词转化成向量为了让计算机更好的理解 大模型推理: 推理时大模型会根据输入计算出下一个输出的分词的集合 分词输出: 从推理出来的集合中选择一个分词,将新的结果再进行大模…

[75] (NOIP集训) NOIP2024 加赛 8

A.flandre 我的做法是,所有数离散化之后扔进桶里,去枚举选择 \([i,+\infty)\) 内的数的贡献,在所有的 \(i\) 里取一个最大值作为答案 lbtl 指出可能存在最优答案是选择 \([i+1,+\infty)\) 内的所有数与值为 \(i\) 的部分数的数据 和 lbtl 交涉后尝试构造一组相同元素只选后一…

P10974 换根 dp 解题报告

题目传送门 题目大意: 给定一颗无根树,有一个节点是源点,度数为 \(1\) 的点是汇点,树上的边有最大流量。除源点和汇点外,其它点不储存水,即流入该点的水量之和等于从该点流出的水量之和。整个水系的流量定义为原点单位时间内能发出的水量。 现在需要求出:在流量不超过最…

CH592/CH585工具更新说明_USB篇

①打开USB更新工具 ②保证芯片没有供电以及没有GPIO灌电的前提下,将PB22接到低电平GND上(进入BootLoader),再插入USB线供电,之后点击软件中的Search Device即可搜索到设备 ③点击Download下载程序即可 ④烧录成功样例

H5-6 列表标签 有序列表

1、有序标签有序列表是一列项目,列表项目使用数学进行标记。有序列表始于<ol>标签。每个列表始于<li>标签。 <ol><li></li><li></li></ol> 2、type属性: <ol>的属性type拥有的选项1表示列表项目用数字标号(1,2,…

rust学习十二、测试

测试从来不是一件简单的事情,我本人深有体会! 书本作者引用了很重要的话:软件测试是证明 bug 存在的有效方法,而证明其不存在时则显得令人绝望的不足 (Edsger W. Dijkstra 在其 1972 年的文章【谦卑的程序员】(“The Humble Programmer”)) 注:Edsger W. Dijkstra在1…

NOIP2024加赛8

如此状态,如何NOIP状态很不好,恼了。虚拟机太卡了,根本交不上去。 flandre 发现选取的肯定是从大到小排序后的一个后缀,然后就做完了,时间复杂度\(O(n\log n)\)。点此查看代码 #include<bits/stdc++.h> using namespace std; #define rep(i,s,t,p) for(int i = s;i …

根据条件显示不同背景色

1. 概述1.1 问题描述 在 FineReport 中制作报表时,经常遇到在满足一定条件下「单元格/行/列」需要显示为不同的背景色,那么该如何实现呢? 1.2 解决思路 可以通过添加「条件属性>背景」来实现。 设置「当前格子/当前行/当前列」的原理一样,本文以「当前格子」和「当前行」…

Linux下打包Qt应用程序

linux下打包应用程序 非常复杂 接下来一步一步实现 第一步:下载linuxdeployqt程序 我已经保存在了百度网盘,记住qt5用老一些的版本 第二步:下载好后重命名为linuxdeployqt好用一点 然后将其移动到/usr/local/bin目录下 并且授权 记住 一定要授权 检查是否成功 sudo lin…

Linux ubuntu命令行安装图形界面

前言全局说明服务器上默认是没有图形界面的,但是需要时,只能单独安装。或者安装时没有装图形界面,后期又用到。一、说明 环境: Ubuntu 18.04.6 LTS (Linux qt-vm 5.4.0-150-generic #167~18.04.1-Ubuntu SMP Wed May 24 00:51:42 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux)…

H5-6 文本

<em>  定义着重文字<b>   定义粗体文本<i>   定义斜体字<strong> 定义加重语气 <del>  定义删除字<span> 元素没有特定的含义  常用文本标签和段落是不同的,段落代表一段文本,而文本标签一般表示文本词汇 可以嵌套在&l…