首页 > 其他分享 >QOJ #8673. 最短路径

QOJ #8673. 最短路径

时间:2024-08-16 19:49:21浏览次数:11  
标签:frac 复杂度 短路 最短 8673 Dijkstra QOJ 边权 dis

题面传送门

一年前,折戟沉沙,后面忘了。

首先我们考虑折半搜索去做这个题。对于 \(x\),在正向的图上跑 Dijkstra,对于 \(y\),在反图上跑 Dijkstra。当两边搜到同一个点的时候,所有的最短路都可以表示成:\(x\to x'\to y'\to y\),其中 \(x'\) 是 \(x\) 已经扩展过的点,\(y'\) 是 \(y\) 已经扩展过的点,结合 Dijkstra 的流程不难说明这个贪心的正确性。

我们发现,在两边碰撞之前,每次扩展的点都是完全独立的,因此如果两边扩展相同的点数,那么相当于每次随机抽一个点出来问什么时候会抽出来一个点两次,由生日悖论容易说明只需要进行 \(O(\sqrt n)\) 次扩展。

因为图是随机的,所以可以认为每个点的期望度数是 \(O(\frac{m}{n})\) 级别的,因此上述过程的复杂度就是 \(O(qmn^{-\frac{1}{2}}\log n)\) 的,可以通过 55p。

我们希望能把 \(m\) 优化掉。首先是 Dijkstra 部分,我们可以先对于每个点的出边按照边权排序,那么对于一个点的出边,肯定是边权小的边先入堆,然后才是边权大的边入堆,因此堆的操作次数就只与点数线性相关了。

这个时候你会发现你已经能过了,第一部分的复杂度被优化到了 \(O(n^{\frac{1}{2}}\log n)\),但是第二部分的复杂度还是 \(O(mn^{-\frac{1}{2}})\),虽然其实 \(O(m^{\frac{3}{4}})\) 的单次询问看上去已经很能过了,但是我们可以做到更好。记 \(dis_{x,y}\) 表示从 \(x\) 走到 \(y\) 的最短路,中间交汇的点为 \(r\),则现在实际上已经有了一个最短路 \(dis_{x,r}+dis_{r,y}\),假设我们现在的最短路是 \(dis_{x,s}+w_{s,t}+dis_{t,y}\),则 \(w_{s,t}\leq 2\max(dis_{x,r}-dis_{x,s},dis_{r,y}-dis_{t,y})\)。如果右侧没有 \(2\) 的系数,那么边数就是前面 Dijkstra 遍历的边数,是 \(O(\sqrt n)\) 级别的,加了这个 \(2\),感性理解一下,也就乘个 \(O(1)\) 倍,因此后面部分的复杂度也就和前面一样了。

但是更慢了怎么会是呢?

submission

标签:frac,复杂度,短路,最短,8673,Dijkstra,QOJ,边权,dis
From: https://www.cnblogs.com/275307894a/p/18363544

相关文章

  • Johnson全源最短路
    Johnson全源最短路引入对于一个无负环的图,我们可以用Floyd或n遍Bellman-ford求出它的全源最短路Floyd复杂度为O(\(n^3\))在稀疏图上效率极低n遍Bellman-fordO(\(n^2m\))效率远不及Floyd注意到n遍dijstra复杂度为O(\(nm~log~m\))或O(\(n^3\))快于Floyd但无法在负权图上跑,考......
  • 最短路算法
    存在最短路的前提不存在负环。链接还是OIWiki好啊~~Floyd算法两两间最短路,可判负环。时间复杂度\(O(n^3)\)。像DP的思路一样。设\(f_{k,x,y}\)表示允许经过\(1\simk\)的点,\(x\toy\)的最短距离。\(O(n^3)\)的DP即可。按照\(k,x,y\)的顺序循环,每次与\(......
  • 「Day 5—最短路径」
    最短路问题单源最短路全源最短路Floyd算法通过转移方程判断i->j的路径中,是否有i->k->j更短,运用简单dp来转移状态。f[i][j]表示i->j的最短路径长度。但不要忘了初始化,一个点到其本身的最短路径为1,即f[i][i]=1,其余的初始化为'1e9'即可。for(inti=......
  • 【学习笔记】Matlab和python双语言的学习(图论最短路径)
    文章目录前言一、图论基本概念示例二、代码实现----Matlab三、代码实现----python总结前言通过模型算法,熟练对Matlab和python的应用。学习视频链接:https://www.bilibili.com/video/BV1EK41187QF?p=36&vd_source=67471d3a1b4f517b7a7964093e62f7e6一、图论图论(G......
  • 算法板子:最短路问题——包含朴素Dijkstra算法、堆优化版的Dijkstra算法、SPFA算法、Fl
    目录1.几种算法的用途2.Dijkstra算法——求源点到其他所有点的最短路径(不能处理负边权)(1)朴素Dijkstra算法——适用于稠密图(2)堆优化版的Dijkstra算法——适用于稀疏图4.SPFA算法——求源点到其他所有点的最短路径、判断是否存在负环(可以处理负边权)(1)求有负边权的图......
  • 最短路
    最短路算法框架单源最短路:求一个点到其他点的最短路多源最短路:求任意两点的最短路稠密图用邻接矩阵存,稀疏图用邻接表来存。稠密图:m和n2一个级别稀疏图:m和n一个级别dijkstra算法朴素版用来求一个源点到其他点的最短距离#include<bits/stdc++.h>usingnamespacestd;str......
  • 3244. 新增道路查询后的最短距离 II
    原题链接题解建桥相当于把区间内的路合并起来,这引导我们用并查集维护可是具体如何实现呢?我们令桥内的所有节点的统一指向最右端点作为首领,然后对于桥内的所有小桥,每次更新完了之后往右边走一格codeclassSolution{public:intfa[2000005];intfinds(intnow){r......
  • Studying-代码随想录训练营day62| Floyd 算法精讲、A*算法精讲(A star算法)、最短路算法
    第62天,完结撒花*★,°*:.☆( ̄▽ ̄)/$:*.°★*,最后的两个算法学习,编程语言C++目录Floyd算法精讲A*算法精讲(Astar算法) A*算法 复杂度分析 A*算法的缺点最短路算法总结篇 图论总结深搜和广搜并查集最小生成树 拓扑排序 最短路算法 总结 Floyd算法精讲......
  • 代码随想录算法训练营第62天 | 最短路径:dijkstra(堆优化版)+ Bellman_ford算法
    47.参加科学大会https://kamacoder.com/problempage.php?pid=1047dijkstra(堆优化版)精讲https://www.programmercarl.com/kamacoder/0047.参会dijkstra堆.html#思路94.城市间货物运输Ihttps://kamacoder.com/problempage.php?pid=1152Bellman_ford算法精讲https://www.pr......
  • 关于最短路
    定义单源最短路:从一个点出发,到其他所有点的最短距离多源最短路:从图中任意一点出发,到其他所有点的最短距离记号\(n~\)为图上点的数目,\(m~\)为图上边的数目;\(s~\)为最短路的源点;\(D(u)~\)为\(~s~\)点到\(~u~\)点的实际最短路长度;\(~dis(u)~\)为s点到u点的估计最短......