20ZR暑期联赛班——图论
HDU 4479 Shortest path
求 1 → n 1 \to n 1→n 边权单调递增的最短路。
这道题已经脱离常规最短路的范畴了。
先考虑所有边权都不重复的情况,可以将所有边从小到大排序,一个个加入最短路中。具体的,对于边 ( 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 1≤n,m≤105
有一个显而易见的转换,如果将图中的边权都乘以 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} 1≤n≤500,1≤m≤2n(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 ai≤A 且 b i ≤ B b_i \leq B bi≤B 的边后图仍然联通。目标最小化 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 2≤n≤200,1≤m≤5×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 1≤n,m≤103
枚举第 k k k 大的边权,假设为 l l l。如果我们能求出这个情况下的最短路就好了。
神仙把所有边权 w w w 变为 max ( w − l , 0 ) \max(w - l, 0) max(w−l,0)。然后跑最短路,把答案加上 k × l k \times l k×l,取最小值即可。考虑一个路径如果它的第 k k k 大值刚好为 x x x,那么加上 k l kl kl 刚好是最短路。否则一定比这个值大。