首页 > 其他分享 >[笔记](更新中)最短路问题的变形

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

时间:2024-11-27 20:11:14浏览次数:3  
标签:cnt log 变形 短路 笔记 int Dijkstra dis

求\(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即可。

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

标签:cnt,log,变形,短路,笔记,int,Dijkstra,dis
From: https://www.cnblogs.com/Sinktank/p/18572532

相关文章

  • 拉格朗日插值学习笔记
    拉格朗日插值学习笔记插值什么是插值?插值是一种通过已知的、离散的数据点推算一定范围内的新数据点的方法。插值的一般形式如下:已知\(n\)个点\(P_1(x_1,y_1),P_2(x_2,y_2),\dots,P_n(x_n,y_n)\),求\(n-1\)次多项式\(f(x)\)满足\[f(x_i)=y_i~,\quad\foralli\in[1,n]~.......
  • 【C语言】· 第五讲 · Printf 与 Scanf 学习笔记
    Printf与Scanf一、printf1、 基本⽤法printf()的作⽤是将参数⽂本输出到屏幕。它名字⾥⾯的f代表format(格式化),表⽰可以定制输出⽂本的格式。printf()不会在⾏尾⾃动添加换⾏符,运⾏结束后,光标就停留在输出结束的地⽅,不会⾃动换⾏。为了让光标移到下⼀⾏的开头......
  • Java学习笔记--继承的介绍,基本使用,成员变量和成员方法访问特点
    目录一,继承1.什么是继承2.怎么去继承:3.注意:4.继承怎么学   二,继承基本使用三,成员变量和成员方法访问特点1.成员变量访问特点1,子类和父类中的成员变量不重名:总结:2,子类和父类中的成员变量重名总结:三,成员方法访问特点1,子类和父类中的成员变量不重名:2,......
  • 深度学习笔记——常见的Transformer位置编码
    本文详细介绍3种常见的Transformer位置编码——正弦/余弦位置编码(sin/cos)、基于频率的二维位置编码(2DFrequencyEmbeddings)、旋转式位置编码(RoPE)文章目录Transformer中常见的编码方式正弦/余弦位置编码(SinusoidalPositionalEncoding)基于频率的二维位置编码(2DFr......
  • Harmony开发笔记3
    预览Harmony开发和Compose类似,在组件上增加@Preview后则可以在预览面板上看到UI效果。组件预览我们新建一个组件,该组件仅展示一个文本内容。@ComponentexportstructHelloComponent{@Statemessage:string="ThisiscomponentText"build(){Row(){......
  • OS开发笔记(1)——硬盘引导的尝试
    看前提醒:这一系列笔记完全是按照我的思考顺序写的,中间可能会绕弯路定义为了避免概念的混淆,我先在这里作一下(仅适用于本文的)名词的解释:引导程序/boot程序:特指磁盘MBR或者VBR扇区中存放的程序加载器/loader程序:指由引导程序加载执行的程序,用于加载操作系统的内核引导:指从BIO......
  • 基础算法——前缀和、差分 学习笔记
    前缀和及差分前缀和一维前缀和定义一维前缀和,就是数组前若干项的和。我们对于前缀和数组的定义非常广泛,例如定义\(S(x)\)表示数组\(A(x)\)的前缀和,定义\(A(l,r)\)表示\(A(l)+A(l+1)+\dots+A(r)\),\(S(x)=A(0,x)\);\(S(x)=A(1,x)\);\(S(x)=A(1,x-1)\);\(S(x)......
  • 基础算法——异或哈希算法 学习笔记
    异或哈希算法思想我们关注一个区间内出现了什么数字。因此,我们对每一个数字赋一个随机权值,然后对这个权值进行一系列操作,例如前缀\(\operatorname{xor}\)等。对于两个序列,通过Hash的方式判断即可。同时,也可用于满足某些条件的子序列数量的问题。我们可以通过Hash的方......
  • PAWNYABLE kernel stack overflow 笔记
    PAWNYABLE中的第一节stackoverflow的学习笔记。(觉得这个教程好细致,而且封面好可爱...这一节讨论内核的栈溢出,分成了不同防护程度的情况来讨论不同的情况下面,攻击应该如何进行。基本的思路在module_write里面,copy_from_user的大小是用户控制,大小没有检查的。可以在这里......
  • HarmonyOS开发笔记2
    应用基本信息我们先来看下harmony的工程结构中的文件主要涉及以下几个目录AppScope>app.json5:应用的全局配置信息,详见app.json5配置文件。entry:HarmonyOS工程模块,编译构建生成一个HAP包。src>main>ets:用于存放ArkTS源码。src>main>ets>entryability:应用/服务......