首页 > 其他分享 >NOIP复习(一)最短路

NOIP复习(一)最短路

时间:2022-09-05 08:13:04浏览次数:85  
标签:闭包 洛谷 复习 NOIP 短路 Dijkstra 例题 dis

dijkstra

复习一遍模板。Dijkstra模板

适用性:适用于非负权图。

每个点第一次从堆中被取出时,其 \(dis\) 一定是最短路。

\(Dijkstra\) 贪心的正确性

现证明:取出 \(x\) 时,它的 \(dis\) 已经是最短路。

反证法:若 \(x\) 的 \(dis\) 不为最短路,其更新路径有两种方式,即由堆里扩展而来或由外部点扩展而来。

  1. 由堆中点扩展而来,由于 \(dis[x]\) 的最小性,所以无论堆中的点怎样扩展,都不能小于 \(dis[x]\)

  2. 由外部点扩展而来,要到达外部点,首先必须得由堆中点扩展而来,所以也不存在小于 \(dis[x]\) 的可能。

综上所述,点 \(x\) 第一次从堆中被取出的时候,其 \(dis\) 一定是最短路。

例题 \(1.1\):海滩防御 - 洛谷

\(dijkstra\) 算法的扩展应用:

  1. 求最短路上的最大边权。

具体实现与 \(Dijkstra\) 差别不大,每次更新时用边权更新 \(dist\) 数组即可。

int z = std::max(edge[i], dist[x]);
if (z < dist[y])
    dist[y] = z, q.emplace(-d[y], y);

例题 \(1.2\):通往奥格瑞玛的道路 - 洛谷

\(Dijkstra\) 加二分,易发现答案具有单调性,二分答案,\(Dijkstra\) 判断可行性。

例题 \(1.3\):[JLOI2011] 飞行路线

分层图最短路模板。

思路:将一个节点扩展成 \(k\) 个节点,每个节点与相应的其它节点称为一层,每层之间连边权为零的边即可。

更简洁的,可以用 \(dp\) 实现。

例题 \(1.4\):[GXOI/GZOI2019]旅行者 - 洛谷

比较巧妙的一道题,或许可以称作多源最短路?

在原图和反图上分别跑一遍最短路,分别求出,兴趣城市到其它所有点的最短距离和其他点到兴趣城市的最短距离。

初始时,将所有兴趣城市入队。(正确性:想象一个虚拟原点,其与每个兴趣城市都有一条边权为 \(0\) 的边)

最终答案为 \(\min_{u,v}\{df(u)+ds(v)+edge(u,v)\}\)

\(df, ds\) 分别表示兴趣城市到其它点的最短距离和其他点到兴趣城市的最短距离。

例题 \(1.5\):[ICPC-Beijing 2006] 狼抓兔子 - 洛谷

题解-[ICPC-Beijing 2006] 狼抓兔子

例题 \(1.6\):速度限制 - 洛谷

类似于分层图最短路,可以用 \(Dijkstra\) 配合 \(DP\) 实现,设 \(F(i,s)\) 表示到达点 \(i\) 时,速度为 \(s\) 的最短路。

转移即可。

spfa

\(SPFA\) 与负环:

定理 \(2.1\) :若最短路边数大于 \(n-1\) ,则整张图存在负环。

判断负环:具体地,记录 \(c_i\) 表示从源点到 \(i\) 的最短路边数,松弛时,令 \(c_y=c_x + 1\) ,并判断 \(c_y\) 是否大于 \(n-1\) 。

复习一下:spfa 模板

例题 \(2.1\):跑路 - 洛谷

结合倍增考察。

预处理出每两个点是否只需一次跑路可以到达,连边后跑 \(SPFA\) 即可。

具体地:设 \(F(i,j,k)\) 表示 \(i, j\) 之间是否存在一条长度为 \(2^k\) 的路径,用 \(F(i, j, k) = (F(i,t,k-1)~\mathrm{and}~F(t,j,k-1))\) 。

FLoyd

\(floyd\) 很短很好记忆,关键代码仅有一行。

d[i][j] = std::min(d[i][j], d[i][k] + d[k][j]);

\(Floyd\) 与传递闭包:

传递闭包:已知一些元素之间的关系,且满足关系具有传递性,求出尽可能多的元素之间的关系。

\(Floyd\) 求解传递闭包问题只需将内层操作改为 \(f(i,j)=f(i,j)~\mathrm{or}~(f(i,k)~\mathrm{and}~f(k,j))\) 即可。

\(Floyd\) 求传递闭包的 \(bitset\) 实现:

std::bitset<Maxn> q;
for (int k = 1; k <= n; k++)
    for (int i = 1; i <= n; i++)
        if (f[i][k]) f[i] = f[i] | f[k];

时间复杂度:\(O(\frac{n^3}{w})\) ,\(w\) 是一个常数,约为 \(64\) 。

实际应用:求出在图中点 \(i,j\) 是否可达。

例题 \(3.1\):[USACO07MAR]Ranking the Cows G - 洛谷

相当于给定一张有向图,问最坏情况下加几条边才能使它联通。

\(Floyd\) 跑传递闭包即可。

评测记录 - 洛谷

标签:闭包,洛谷,复习,NOIP,短路,Dijkstra,例题,dis
From: https://www.cnblogs.com/mklzc/p/16656764.html

相关文章

  • NOIP复习(二)二分算法
    提供一种二分写法,不太用考虑边界的问题。intl=st,r=ed,ans=ed+1;while(l<=r){intmid=(l+r)>>1;if(check(mid))ans=mid,l=mid+......
  • 最短路
    Floyd算法voidfloyed(){memset(f,0x3f,sizeoff);for(inti=1;i<=n;i++){for(intj=1;j<=n;j++){if(a[i][j]!=0)f[i][j]=a[i][j];......
  • GYM100851 F - Froggy Ford(最短路铜牌题)
    题意:​ 现在有一条河,河中有n个石头,你需要从河的一端到河的另一端。现在你有一次机会在任意位置放置一个石头,请问石头放在哪里可以使过河的最长路径最短。请输出放置的石头......
  • mysql复习
    ##数据库的好处 1.持久化数据到本地 2.可以实现结构化查询,方便管理##数据库相关概念 1、DB:数据库,保存一组有组织的数据的容器 2、DBMS:数据库管理系统,又称为数据库软件(产......
  • 最短路算法之 Dijkstra
    部分内容参考了李煜东的《算法竞赛进阶指南》,在此声明。单源最短路径单源最短路径问题,是说,给定一张有向图(无向图)\(G=(V,E)\),\(V\)是点集,\(E\)是边集,\(|V|=n\),\(|......
  • java复习随笔(四)——集合
    集合Collection单列Collection单列集合的顶层接口,它表示一组对象,这些对象也称为Collection的元素。JDK不提供此接口的任何实现,它提供更具体的子接口(如set和list)的实现。......
  • 9.3 noip 模拟赛 1 题解
    noip模拟赛1题解目录noip模拟赛1题解\(\tolink\leftarrow\)A一步之遥退位计划退役以后重在参与\(\tolink\leftarrow\)A一步之遥构造题手玩了一下没有什么......
  • 洛谷P1850 [NOIP2016 提高组] 换教室(期望dp)
    #include<bits/stdc++.h>usingnamespacestd;intn,m,v,e;intc[3005],d[3005];intf[305][305];doubledp[3005][3005][2];//dp[i][j][k]表示前i步申请更换了j......
  • 8.9.1元组集合的复习回顾
      ......
  • java复习随笔(三)
    常用类StringBuffer类String类创建的字符串是常量,是不可更改的。若要对字符串进行动态增减。则用StringBuffer类,它的对象是可以扩充和修改的,因此StringBuffer又称动态字......