2026.9 图论专题做题记录

CF547D Mike and Fish

将横纵坐标看成两排点,记第 \(x=i\)\(i_x\),第 \(y=i\)\(i_y\)

那么 \(i_{x}\)\(i_y\) 连边后得到二分图。给二分图边黑白染色,使得每个点的连边中黑白点数量差不超过 \(1\)

注意到一个奇数度数的点黑白点数量差一定为 \(1\)。考虑建一个虚点来平衡度数。将所有奇数度数的点和这个虚点连一条边,那么所有点的度数都变成偶数了。

这样可以跑从虚点出发的欧拉回路,对于构造,所有左部点走向右部点为黑;右部点走向左部点为白。考虑证明合法性:

  1. 如果一个点度数是偶数。根据欧拉回路,一定有一半回一半出。黑白数量相同。
  2. 如果一个点度数是奇数。同理,算上与虚点的边后一定有一半回一半出。又因为和虚点的边不染色,所以黑白数量差 \(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\),将其在两棵树中连起来。

那么所有点的度数都是偶数了。

跑一遍欧拉回路,构造:

  1. 这条边为 \(T_1\) 中的边或 \(T_2\) 中的边。不管。
  2. 这条边从 \(T_1\)\(T_2\)。将这个点点权设为 \(1\)
  3. 这条边从 \(T_2\)\(T_1\)。将这个点点权设为 \(-1\)

考虑证明其合法性。将欧拉回路拆成若干个环。对 \(T_1\) 中的点 \(u\) 的所有边分类讨论:

  1. \(u\) 先走到某个儿子,最后走到 \(T_2\) 中的 \(u\)\(u\) 的某个儿子返回。注意到这样从子树中某个点走到 \(T_2\) 会贡献 \(1\),从 \(T_2\) 回到子树某个点会贡献 \(-1\)。所以整体贡献 \(0\)
  2. \(u\) 先走到某个儿子,最后走到 \(u\) 的父亲返回。此时只会贡献 \(1\)
  3. \(u\) 先走到 \(T_2\) 中的 \(u\),最后走到 \(u\) 的父亲返回。同样只会贡献 \(1\)
  4. \(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})\)

  1. 是最小生成树上的边。设 \(u\) 深度较小。
    1. 维护 \(f_x\)\(x\)\(1\) 边权最小值,将 \(v\) 子树中所有点的 \(f_x\)\(t_{max}\)\(\min\)(初始化 \(+\infin\))。
  2. 不是最小生成树上的边,此时会形成边双。注意到一个边双中的边都是可以经过的。所以考虑将 \(P(u,v)\) 中所有边双合并,其中 \(P(u,v)\) 为树上 \(u\)\(v\) 的路径。
    1. 维护 \(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)\)
    2. \(w\) 子树中所有点的 \(f_x\)\(h_w\)\(\min\)
    3. 维护 \(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\) 个部分:

  1. \(c_x = i\) 中选择的点数量不小于 \(2\)。由上面的连边方式得知不可能存在。
  2. \(c_x = i\) 中选择的点数量等于 \(1\)。合法。
  3. \(c_x = i\) 中选择的点数量等于 \(0\)。说明对于所有 \(c_u = i\)\((u,v)\) 都满足 \(c_v \ne i\)。因为如果 \(c_v = i\) 显然不满足至少选一个的限制。那么此时任意再选一个 \(c_u = i\) 的点也是可以的。所以合法。

时间复杂度 \(O(n+m)\)

posted @ 2026-09-03 21:06  harmis_yz  阅读(3)  评论(0)    收藏  举报