图论杂题选做
图论杂题选做
Problem A. UOJ605 知识网络
相同标签之间的边数太多,所以 每个标签建一个新点,点向标签连 \(0\) 边,标签向点连 \(1\) 边。边数降为 \(O(n+m)\)。
点数太多,不能直接跑,但 标签很少。所以可以先以每个标签为起点跑 01BFS 求出 \(dis\)。
对任意一个点 \(x\),标签内的点与其 \(dis\) 相差不超过 \(1\)。建出最短路径图,若 DAG 上 \(y\) 可到达 \(x\),则 \(dis_{y,x}\) 要减一。
但 DAG 上的可达性问题很难做到 \(O(n^2)\) 以下,但可以 用 bitset 除 \(w\)。但直接开空间不够,考虑 每 \(B\) 个起点一起做,时间 \(O((k+\frac n B)\frac {nB}w)\),空间 \(O(\frac{nB} w)\),取 \(B=300\) 可以通过。(关键 trick)
总时间 \(O(k(n+m)+\frac {n^2} w)\),空间 \(O(\frac{nB} w)\)。
https://uoj.ac/submission/784273
Problem B. [CF875F] Royal Questions
将每个公主看做 \((u,v,w)\),以每个王子为点,重新建出一张一般图。问题转化为,选出若干边,并给它们定向,使每个点入度最多为 \(1\),最大化边权和。
类似于 Kruskal,求出最大 生成树/基环树森林即可。
https://codeforces.com/contest/875/submission/332940134
Problem C. [ARC092F] Two Faced Edges
对每条边分讨一下:
- \(u,v\) 在同一 SCC 内。SCC 数量变化,当且仅当 \((u,v)\) 这条边是 \(u\) 到 \(v\) 的必经边。
- \(u,v\) 不在同一 SCC 内。SCC 数量变化,当且仅当 \((u,v)\) 这条边不是 \(u\) 到 \(v\) 的必经边。
我们枚举起点 \(s\),先从前到后枚举 \(s\) 出边,若遍历到 \(t\) 时已经被遍历则 \(t\) 可以被前面的点到达,\((s,t)\) 不是必经边。然后再倒着跑一遍。复杂度 \(O(nm)\)。
Submission #68279931 - AtCoder Regular Contest 092
Problem D. UOJ32 跳蚤公路
考虑 bellman-ford 判负环,设 \(f_{u,i}\) 为 \(u\) 点迭代 \(i\) 次的最短路,若 \(f_{u,n}<f_{u,n-1}\) 则 \(x\) 能到达的所有点都有发财路径。
对于 \(x\),我们再加一维,设 \(f_{u,t,i}\) 为 \(u\) 点迭代 \(i\) 次,\(x\) 前系数是 \(t\) 的最短路。那么没有负环,需要满足
转化为逻辑符号,
固定 \(t\),对所有 \(p\) 解出的范围取并,然后对所有 \(t\) 解出的范围取交。再更新一下其所能到达的所有节点即可。
提交记录 #790296 - Universal Online Judge
Problem E. UOJ513 清扫银河
观察: 本质上是在选出一堆边进行异或操作。
对于 1 操作,先随便搞出一个生成森林,每条非树边对应一个简单环,所有的简单环都能由若干个这样的环异或得到。设连通块数量为 \(c\),这样的环不超过 \(m-n+c\) 个。
对于 2 操作,操作可以拆为单点,不超过 \(n-c\) 次。加起来操作次数不超过 \(m+1\),所以只需判断有没有解。
直接将边集扔进线性基是 \(O(m^3/w)\) 的,考虑优化。
观察: 二操作可以若干个点一起操作,可以只做一次。
对于一个 2 操作点集,若操作后每个点的 1 边数量都是偶数就合法。
未知数的数量缩小到 \(n\),由此列方程,高斯消元求解,\(O(n^3/w)\)。
提交记录 #790383 - Universal Online Judge
Problem F. UOJ61 怎样更有力气
考虑 Kruskal,先将 \(m\) 条链按照 \(w\) 排序。设 \(i\) 链的限制数为 \(p_i\)。
若 \(p_i\) 小于 链大小减一,那么相当于没有限制,直接合并。
否则,可以暴力将链上的点拿出来。找到限制图上度数最小的节点 \(x\),则 \(deg_x\) 不超过 \(O(\sqrt{p})\)。
将与 \(x\) 有连边的点放入 \(T\) 集合,其他的放入 \(S\)。\(S\) 中的点可以直接与 \(x\) 合并,\(T\) 中节点可以 \(O(|T|^2)\) 合并,然后再合并 \(S,T\),判一下 \(T\) 中点与 \(S\) 的连边是否达到 \(|S|\) 即可。(关键 trick)。
提交记录 #790545 - Universal Online Judge
Problem G. [ABC232G] Modulo Shortest Path
将 \((A_i+B_j)\bmod m\) 看作 \((A_i-(-B_j))\bmod m\)。这也就是在长度为 \(m\) 的环上从 \(-B_j\) 走到 \(A_i\) 的步数。
建出长为 \(m\) 的不可接受,但可以离散化,然后 Dij 即可。
Problem H. P5590 赛车游戏
设 \(dis_x\) 为 \(1\) 至 \(x\) 的距离,则 对于所有边 \((u,v,w)\),满足 \(dis_u+w=dis_v\)。
加上 \(1\le w\le 9\) 的限制,跑差分约束即可。
Problem I. [AGC056C] 01 Balanced
设 \(s_i\) 为序列前缀和,则有限制 \(s_i\le s_{i+1}\le s_{i}+1,s_{L-1}+\frac{R-L+1}{2}=s_R\)。按这个条件建差分约束,会有负权边,不能接受。
把 \(0\) 看作 \(-1\),则条件转化为 \(|s_i-s_{i-1}|=1,s_R=s_{L-1}\)。
第一个条件还可以放宽为 \(s_i\le s_{i+1}+1,s_{i+1}\le s_i+1\) 而不会出现 \(s_i=s_{i+1}\) 的情况,这由 \(L,R\) 之间的奇偶性限制 与 最短路差分约束的最大性 保证。
可以 Dij,也可以 01 BFS。
Problem J. P7515 [省选联考 2021 A 卷] 矩阵游戏
没有 \(0\le a_{i,j} \le M\) 的限制,只需要把第一行和第一列全设为 \(0\),其余的值是固定的。
加上限制,那么需要 调整第一行和第一列的值。以列为例,将 \(a_{1,i}\) 增加 \(x\),那么有三种情况:
- 第一行 \(+x,-x,+x,-x,+x\cdots\);
- 第 \(i\) 列 \(+x,-x,+x,-x,+x,\cdots\);
- 整个矩阵\[\begin{bmatrix} +x & 0 & +x & 0 & +x \\ 0 & -x & 0 & -x & 0\\ +x & 0 & +x & 0 & +x \\ 0 & -x & 0 & -x & 0\\ +x & 0 & +x & 0 & +x \\ \end{bmatrix} \]
对于行来说同理。第一种没有意义,第三种可以用行和列拼出来,所以只需考虑第二种。
将 \(a_{i,1}\) 设为 \(x_i\),将 \(a_{1,i}\) 设为 \(y_i\),那么限制为
出现同号时不好处理,所以我们奇数行 \(+x\),偶数行 \(-x\),奇数列 \(-y\),偶数列 \(+y\),这样就让 \(x_i,y_i\) 始终异号。\(a_{1,i},a_{i,1}\) 的值再由 \(x_1,y_1\) 来调整。差分约束,\(O(nm(n+m))\)。
https://www.luogu.com.cn/record/194542897
Problem K. P7516 [省选联考 2021 A/B 卷] 图函数
将 \(h(G)\) 拆到每个点上。只保留 \(\ge u\) 的点,若 \(u\rightsquigarrow v\) 且 \(v \rightsquigarrow u\),则 \(u\) 对 \(f(v,G)\) 造成 \(1\) 的贡献。
求每个 \(h(G_i)\),我们求出只保留 \(\ge u\) 的点,\(u\rightsquigarrow v,v \rightsquigarrow u\) 路径上最大的瓶颈(最小边),设为 \(g(u,v)\),那么 \((u,v)\) 这个点对给 \(h(G_0)\sim h(G_{g(u,v)})\) 造成贡献。Floyd 做到 \(O(n^3)\)。
固定 \(u\),求所有 \(g(u,v)\)。从大到小给原图和反图加边,加入 \((x,y)\) 时,若 \(y\) 已经可达,则忽略它;若 \(x\) 可达,\(y\) 不可达,则从 \(y\) 开始 BFS 更新其他点;若 \(x,y\) 都不可达,就将其加入图中。
每条边只会遍历一次,总复杂度 \(O(nm)\)。

浙公网安备 33010602011771号