19ZR十一集训 最短路和生成树

20ZR暑期联赛班——图论

HDU 4479 Shortest path

1 → n 1 \to n 1n 边权单调递增的最短路。

这道题已经脱离常规最短路的范畴了。

先考虑所有边权都不重复的情况,可以将所有边从小到大排序,一个个加入最短路中。具体的,对于边 ( u , v ) (u,v) (u,v),如果通过之前的边能到达 u u u 即为 d i s u ≠ − 1 dis_u \not =-1 disu=1,那么用这条边去松弛 v v v,对于 v v v 来说同理。

如果边权重复怎么办呢。如果 1 1 1 能到达 x x x,那么会松弛 y y y,这样 1 1 1 也能到达 y y y 了,接着就把 z z z 松弛了。但这就不满足边权单调递增的限制了。所以将边权相等的边放在一起做,把能进行的松弛记下来,等与它边权相等的边都处理完了再去松弛。

毒瘤

求边权是二的幂的最短路。

CF938D Buy a Ticket

给定一张 n n n 个点 m m m 条边的无向图,边有边权、点有点权。令第 i i i 个点的点权为 a i a_i ai,两个点间路径最小的边权和为 d ( i , j ) d(i,j) d(i,j),对于每个点 i i i,你需要求

min ⁡ j = 1 n 2 × d ( i , j ) + a j \min_{j =1}^n 2 \times d(i,j) + a_j j=1minn2×d(i,j)+aj

1 ≤ n , m ≤ 1 0 5 1 \leq n,m \leq 10^5 1n,m105

有一个显而易见的转换,如果将图中的边权都乘以 2 2 2 就把系数给化掉了。但直接算柿子的话需要全源最短路,显然炸掉了。

考虑建立一个源点 S S S,向第 i i i 个点连的边边权为 a i a_i ai,然后从 S S S 出发跑一个单源最短路就做完了。

GZOI 2019 旅行者

未知来源

给定一张 n n n 个点 m m m 条边的无向图,对于任意点对,你需要求出两点之间所有最短路覆盖的边数。

1 ≤ n ≤ 500 , 1 ≤ m ≤ n ( n + 1 ) 2 1 \leq n \leq 500, 1\leq m \leq \frac{n(n+1)}{2} 1n500,1m2n(n+1)

有一个暴力:用 Floyd 预处理一下。先枚举所有的点对,再枚举所有的边,然后判断每条边是否在两点的最短路上。边 ( u , v , w ) (u,v,w) (u,v,w) s s s t t t 的最短路上的充要条件为 dis ⁡ ( s , u ) + w + dis ⁡ ( v , t ) = dis ⁡ ( s , t ) \operatorname{dis}(s,u)+w+\operatorname{dis}(v,t)=\operatorname{dis}(s,t) dis(s,u)+w+dis(v,t)=dis(s,t) dis ⁡ ( s , v ) + w + dis ⁡ ( u , t ) = dis ⁡ ( s , t ) \operatorname{dis}(s,v)+w+\operatorname{dis}(u,t)=\operatorname{dis}(s,t) dis(s,v)+w+dis(u,t)=dis(s,t)。这样时间复杂度是 O ( n 2 m ) O(n^2m) O(n2m) 的。

可以发现,我们在枚举点对后,枚举边的话会超时,而枚举点不会。所以统计以每个点为结束点的边有多少个,问题就转换成了统计有多少个点在最短路上,充要条件为 dis ⁡ ( s , p ) + dis ⁡ ( p , t ) = dis ⁡ ( s , t ) \operatorname{dis}(s,p)+\operatorname{dis}(p,t)=\operatorname{dis}(s,t) dis(s,p)+dis(p,t)=dis(s,t)

时间复杂度 O ( n 3 ) O(n^3) O(n3)

CF76A Gift

给定一张 n n n 个点 m m m 条边的无向连通图,每条边有两个权值 a i a_i ai b i b_i bi。你需要确定两个参数 A A A B B B,使得只保留 a i ≤ A a_i \leq A aiA b i ≤ B b_i \leq B biB 的边后图仍然联通。目标最小化 A × W A + B t × W B A \times W_A + B t \times W_B A×WA+Bt×WB,其中 W A W_A WA W B W_B WB 均为给定的常数。

2 ≤ n ≤ 200 , 1 ≤ m ≤ 5 × 1 0 4 2 \leq n \leq 200, 1 \leq m \leq 5 \times 10^4 2n200,1m5×104

有一个直接的想法。枚举 a i a_i ai 作为 A A A,把满足条件的边取出来,接下来要图联通的前提下 B B B 最小,这就是最小瓶颈生成树。用 Prim 写的时间复杂度为 O ( n 2 m log ⁡ n ) O(n^2m \log n) O(n2mlogn)

发现两个不同的 A A A 可能边集相差不大。所以将 a i a_i ai 从小到大排序,依次加入最小瓶颈树的可用边集,二分找到它的位置,然后用 Kruskal 暴力更新一下。时间复杂度为 O ( n m ) O(nm) O(nm)

CF892E Envy

给定一个 n n n 个点 m m m 条边的无向连通图。每个询问给定一个边集,求它们能否出现在一个 MST 中。

边集大小之和 ≤ 5 × 1 0 5 \leq 5 \times 10^5 5×105

  • 结论 1 \quad 一张图中可能有多个 MST,但不同的 MST 出现的边权是相同的,且只能通过交换相同边权的枚举顺序来得到不同的 MST。

  • 结论 2 \quad 如果一条边 ( u , v , w ) (u,v,w) (u,v,w) 在 MST 上的充要条件为,只保留边权 < w <w <w 的边 u u u v v v 不联通。

  • 结论 3 \quad 如果边 ( u 1 , v 1 , w 1 ) (u_1,v_1,w_1) (u1,v1,w1) 可以在 MST 上, ( u 2 , v 2 , w 2 ) (u_2,v_2,w_2) (u2,v2,w2) 可以在 MST 上且 w 1 ≠ w 2 w_1 \not= w_2 w1=w2,那么两条边可以在同一棵 MST 上。

  • 结论 4 \quad 如果一个边集中的所有边满足结论 2,且没有形成环,那么一定可以在同一棵 MST 上。

鏼尔德

给定一个 n n n 个点 m m m 条边的无向图,求前 k k k 大边权和最短的路径。

1 ≤ n , m ≤ 1 0 3 1 \leq n, m \leq 10^3 1n,m103

枚举第 k k k 大的边权,假设为 l l l。如果我们能求出这个情况下的最短路就好了。

神仙把所有边权 w w w 变为 max ⁡ ( w − l , 0 ) \max(w - l, 0) max(wl,0)。然后跑最短路,把答案加上 k × l k \times l k×l,取最小值即可。考虑一个路径如果它的第 k k k 大值刚好为 x x x,那么加上 k l kl kl 刚好是最短路。否则一定比这个值大。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值