题解:[ICPC 2024 Yokohama Regional] Remodeling the Dungeon 2
弱化版:CF1284G。
注意到网格图是二分图,则原题可以转化为:给定一张二分图,求出一棵生成树,使得所有叶子都在二分图的同一侧。
不妨设二分图两侧点集分别为 \(L,R(|L|\le |R|)\)。
当 \(|L|=|R|\) 时,假设叶子都在 \(R\),则 \(L\) 中每个点在最后的生成树中度数不小于 \(2\),那么总边数不小于 \(2|L|=|L|+|R|\),超过点数,故这样的生成树不存在,此时无解。
故必须有 \(|L| < |R|\) 且叶子都在 \(R\) 中。类似的,对于任意 \(S\subset L,S\neq\varnothing\),设 \(N(S)=\{u|\exist v\in S,(v,u)\in E\}\),则必须有 \(|N(S)|>|S|\)。
现在问题转化为找到二分图的一棵生成树,使得左部点的度数不小于 \(2\)。这似乎经典的拟阵交问题,但是我不会但是拟阵交太慢了过不了这个题(可以过那个 CF)。
不能拟阵交直接,考虑二分图的特性。上面的限制强于 Hall 定理的条件,所以此时一定存在大小为 \(|L|\) 的匹配。求出一组最大匹配,我们希望先选出所有匹配边,再选出一些边构成合法的生成树。
注意到此时 \(L\) 构成一组最小点覆盖,考虑最小点覆盖的算法。将二分图定向,所有匹配边起点在 \(L\),非匹配边起点在 \(R\)。然后从每个未匹配的右部点开始 dfs,得到 dfs 森林,此时每个被访问过的左部点都一定入度和出度均为 \(1\),也就是选出 dfs 到的所有边即可。
而如果有左部点没有被访问过,设所有这样的左部点集合为 \(L^{\prime}\),与它们相邻的右部点集合为 \(R^{\prime}\)。若 \(|R^{\prime}|>|L^{\prime}|\),则 \(R^{\prime}\) 中必然有未匹配点或与 \(L\setminus L^{\prime}\) 中的点相匹配,此时这个点会被访问,则 \(L^{\prime}\) 中也会有点被访问,矛盾。故此时必有 \(|R^{\prime}|\le|L^{\prime}|\),那么由前面的结论此时必然无解。
所以上面的算法可以在有解的时候构造出一棵生成森林,使得所有左部点度数等于 \(2\)。只需要任意加入若干剩下的边将森林连成树即可。
复杂度瓶颈在于二分图匹配,可做到 \(\mathcal O(E\sqrt{V})=\mathcal O((hw)^{1.5})\)。

浙公网安备 33010602011771号