2026.9 图论专题做题记录
CF547D Mike and Fish
将横纵坐标看成两排点,记第 \(x=i\) 为 \(i_x\),第 \(y=i\) 为 \(i_y\)。
那么 \(i_{x}\) 和 \(i_y\) 连边后得到二分图。给二分图边黑白染色,使得每个点的连边中黑白点数量差不超过 \(1\)。
注意到一个奇数度数的点黑白点数量差一定为 \(1\)。考虑建一个虚点来平衡度数。将所有奇数度数的点和这个虚点连一条边,那么所有点的度数都变成偶数了。
这样可以跑从虚点出发的欧拉回路,对于构造,所有左部点走向右部点为黑;右部点走向左部点为白。考虑证明合法性:
- 如果一个点度数是偶数。根据欧拉回路,一定有一半回一半出。黑白数量相同。
- 如果一个点度数是奇数。同理,算上与虚点的边后一定有一半回一半出。又因为和虚点的边不染色,所以黑白数量差 \(1\)。
时间复杂度 \(O(n)\)。
P15869 【MX-X26-T5】「Cfz Round 7」anybody can finds love (expect you)
考虑给每个点的所有边两两配对,表示只要这次是从其中一个进来或出去的,那么下一步就要从另一个出去或进来。
那么只要一个点所有边对应点不存在绝对众数就一定可以这么配对,同时如果存在绝对众数一定无解。
考虑构造,DFS 的时候存 \((u,pre)\) 表示当前点与上一次经过多边。首先如果 \(pre\) 对应的配对边没有走过,那么强制下一步走配对边出去。对于剩下的配对边,由于这些配对边对应点两两不同,所以一定有一个和 \(pre\) 这条边对应的点不同,先走那个就行了。
复杂度 \(O(n+m)\) 或 \(O((n+m)\log n)\)。
AT_agc018_f [AGC018F] Two Trees
首先不难注意到对于任意一个点 \(u\),若其在两棵树中儿子数量奇偶性不同,则一定无解。
先建个虚点把两棵树连起来(和树根连边)。考虑对于一个奇数度数的点 \(i\),将其在两棵树中连起来。
那么所有点的度数都是偶数了。
跑一遍欧拉回路,构造:
- 这条边为 \(T_1\) 中的边或 \(T_2\) 中的边。不管。
- 这条边从 \(T_1\) 到 \(T_2\)。将这个点点权设为 \(1\)。
- 这条边从 \(T_2\) 到 \(T_1\)。将这个点点权设为 \(-1\)。
考虑证明其合法性。将欧拉回路拆成若干个环。对 \(T_1\) 中的点 \(u\) 的所有边分类讨论:
- \(u\) 先走到某个儿子,最后走到 \(T_2\) 中的 \(u\) 或 \(u\) 的某个儿子返回。注意到这样从子树中某个点走到 \(T_2\) 会贡献 \(1\),从 \(T_2\) 回到子树某个点会贡献 \(-1\)。所以整体贡献 \(0\)。
- \(u\) 先走到某个儿子,最后走到 \(u\) 的父亲返回。此时只会贡献 \(1\)。
- \(u\) 先走到 \(T_2\) 中的 \(u\),最后走到 \(u\) 的父亲返回。同样只会贡献 \(1\)。
- \(u\) 先走到 \(u\) 的父亲,最后走到 \(T_2\) 中的 \(u\) 返回,此时只会贡献 \(-1\)。
由于父亲边只能走一次,所以恰好贡献绝对值为 \(1\)。对 \(T_2\) 中的 \(u\) 同理。
时间复杂度 \(O(n)\)。
P3275 [SCOI2011] 糖果
直接差分约束做。
P11095 [ROI 2021] 旅行 (Day 2)
考虑枚举 \(t_{max}\)。把最小生成树建出来。
加入一条边 \((u,v,t_{max})\):
- 是最小生成树上的边。设 \(u\) 深度较小。
- 维护 \(f_x\) 为 \(x\) 到 \(1\) 边权最小值,将 \(v\) 子树中所有点的 \(f_x\) 对 \(t_{max}\) 取 \(\min\)(初始化 \(+\infin\))。
- 不是最小生成树上的边,此时会形成边双。注意到一个边双中的边都是可以经过的。所以考虑将 \(P(u,v)\) 中所有边双合并,其中 \(P(u,v)\) 为树上 \(u\) 到 \(v\) 的路径。
- 维护 \(g_x\) 为与 \(x\) 在一个边双且深度最小的祖先,\(h_x\) 为 \(x\) 所在边双边权最小值。记 \(w\) 为 \(\text{lca}(u,v)\) 所在连通块。那么分别从 \(u,v\) 开始跳,每次跳到 \(fa_{g_x}\),并维护一路上 \(h_x\) 与 \(t(g_x,fa_{g_x})\) 的最小值,直到跳到 \(g_x = w\)。最后将一路上所有点的 \(g\) 合并成 \(w\),并将 \(h_w\) 更新。显然,跳一次就会合并一次,所以均摊 \(O(n)\)。
- 将 \(w\) 子树中所有点的 \(f_x\) 对 \(h_w\) 取 \(\min\)。
- 维护 \(ans_x\) 为 \(x\) 的答案,将 \(w\) 子树中所有点的 \(ans_x\) 对 \(h_w + t_{max}\) 取 \(\min\)(初始化 \(+\infin\))。
再考虑一个点的真实答案。注意到 \(x\) 和 \(1\) 联通之前 \(ans_x\) 都是假的,所以维护一下每个点和 \(1\) 联通的时间,在枚举到这个时间时将 \(ans_x\) 改成 \(f_x + t_{max}\) 即可。
时间复杂度 \(O(n\log n)\)。线段树需要维护区间取 \(\min\),单点查询,单点修改。
P4630 [APIO2018] 铁人两项
考虑如果 \(s,f\) 确定,\(c\) 有多少种选法。显然 \(c\) 的数量等于 \(s\) 到 \(f\) 所有简单路径并的大小减 \(2\)。
由一个点双中任意 \(3\) 点 \(x,y,z\) 都存在 \(x\) 到 \(y\) 到 \(z\) 的路径得知,\(s\) 到 \(f\) 所有简单路径并等价于 \(s\) 到 \(f\) 所有点双并。
把圆方树建出来,那么这个并的大小减去 \(2\) 的值就等于将方点权值设为点双大小,园点权值设为 \(-1\) 后 \(s\) 到 \(f\) 路径权值和。
DFS 一遍,在 \(\text{lca}\) 处统计即可。时间复杂度 \(O(n + m)\)。
P6378 [PA 2010] Riddle
考虑 2-SAT。
记 \(c_i\) 为第 \(i\) 个点所属部分的编号。记 \(i_0\) 为不选 \(i\),\(i_1\) 为选 \(i\)。
对于一条边 \((u,v)\),\(u_0\) 向 \(v_1\) 连,\(v_0\) 向 \(u_0\) 连,得到至少选一个的限制。
对于一个部分 \(i\),记其点集为 \(S\)。那么一个 \(x\in S\) 需要 \(x_1\) 向 \(y\in S\land y\ne x\) 的 \(y_0\) 连,得到不能选两个以上的限制。这个前缀、后缀优化一下连边就行了。
直接对这个跑一遍 2-SAT。对于第 \(i\) 个部分:
- \(c_x = i\) 中选择的点数量不小于 \(2\)。由上面的连边方式得知不可能存在。
- \(c_x = i\) 中选择的点数量等于 \(1\)。合法。
- \(c_x = i\) 中选择的点数量等于 \(0\)。说明对于所有 \(c_u = i\) 的 \((u,v)\) 都满足 \(c_v \ne i\)。因为如果 \(c_v = i\) 显然不满足至少选一个的限制。那么此时任意再选一个 \(c_u = i\) 的点也是可以的。所以合法。
时间复杂度 \(O(n+m)\)。

浙公网安备 33010602011771号