图论杂题选做 20250802

CF555E Case of Computer Network

先缩边双,同一个边双一定能定成两两点对互相可达的样子。

然后就变成了树上的限制,可以瞎树上差分一下,时间复杂度线性。

QOJ5437 Graph Completing

找到 DFS 树,那么现在的要求就是没有树边不被非树边覆盖。

直接容斥,钦定原图中若干条割边不被非树边覆盖,删掉这些边后形成若干连通块,每个连通块 \(S\) 的方案数是 \(2^{\binom{\lvert S \rvert}{2} - \# E(S)}\)

剩下的部分可以直接 DP:\(f_{u, i}\) 表示以 \(u\) 为根的子树中,\(u\) 所在连通块大小为 \(i\) 的带容斥系数的方案数,转移是简单的。

实现的时候可以先忽略非树边,最后把答案除掉 \(2^{m - n + 1}\) 即可。

时间复杂度 \(O(n^2)\)

P8456 「SWTR-8」地地铁铁

全是性质,懒得写了。

P7353 [2020-2021 集训队作业] Tom & Jerry

Tom 的策略一定是每次都走割点,最后把 Jerry 逼死。

然后随便换根 DP 一下就好。

还有一种特殊的 case 就是如果有一个点不管 Jerry 在哪都能暴毙那就可以直接走到这个点。

时间复杂度线性。

CF2110E Melody

建二分图,左部点是 \(v\),右部点是 \(p\),每个点连 \((v_i, p_i)\),这样求的就是欧拉路径。

P9394 白鹭兰

这个要求看着就很像双极定向,事实上 \(k = 1\) 的时候就是直接把直径端点拉出来双极定向。

\(V_1, V_t\) 中分别选出两点 \(s, t\) 满足它们在圆方树上都是叶子,考察圆方树上 \(s \rightsquigarrow t\) 这条路径。

思考后可以得到,对于路径上方点连接的不在路径上的圆点,它的子树一定是要分成一个点集;对于路径上的圆点,它一定要和它不在路径上的子树分成一个点集。

这样我们就能计算出选取 \((s, t)\) 时的 \(k_{\min}\),现在的问题是怎么快速找到 \(k_{\min}\) 最小的 \((s, t)\)

这里有一个性质:

\(\text{Property}\):记 \(u = \operatorname{lca}(s, t)\),那么 \(u \rightsquigarrow s\) 一定是一直走重儿子,\(u \rightsquigarrow t\) 一定是先走一步次重儿子,然后一直走重儿子。

证明比较显然,略去。

这样我们就能 DFS 一遍线性得到 \((s, t)\)\(k_{\min}\)

构造是简单的,只需要把 \(s \rightsquigarrow t\) 上所有方点对应的点双的并双极定向一下即可。

时间复杂度线性。

QOJ8824 Slay the Spire

将卡牌看成 \(a_i \xrightarrow{b_i} c_i\),药水看成 \(s \xrightarrow{0} x_i\),额外加一条边 \(s \xrightarrow{0} s\),这样问题就变成了:改一条边的入点需要花费边权的代价,求最小的代价使得图存在一个欧拉回路。

存在欧拉回路就是要求每个点入度等于出度,且图中有边的连通块至多有一个。

我们先来满足第一个条件,实际上我们只需要对 \(out_u > in_u\) 的点,修改它们的出边的入点,直到 \(out_u = in_u\),这样我们就满足了第一个条件。

然后是连通的问题,我们删掉上面修改过的边,找到此时的连通块,如果连通块中有一个点 \(u\)\(in_u > out_u\),那一定有我们之前删过的某些边的入点改到了 \(u\),这样的连通块最后一定是连通的。

剩下的连通块中,每个连通块都需要至少修改一条边的入点,这样才能使得右边的连通块只有一个。这里修改入点的时候,如果连通块中之前删过边,那么可以用这条边替换掉之前删的那条。

时间复杂度 \(O(n \log n)\)

posted @ 2025-08-11 15:48  definieren  阅读(34)  评论(0)    收藏  举报