E. Graph Composition 解题思路
核心问题分析与转化
这道题的目标是让图 $F$ 的连通性变得和图 $G$ 完全一样。所谓“连通性一样”,意思就是:如果在图 $G$ 里点 $u$ 和点 $v$ 是能连通的,那么在图 $F$ 里它们也得连通;反之,如果 $G$ 里不连通,$F$ 里也绝对不能连通。
我们要找的是最小操作步数(加边或删边)。
1. 删边的必要性:防止“过度连通”
如果图 $F$ 里有一条边连接了 $u$ 和 $v$,但在图 $G$ 中这两个点根本不在同一个连通分量里,那这条边就是“非法”的。如果不删掉它,$F$ 的连通性就会比 $G$ 强,不符合题目要求。
- 策略:先看 $G$ 的连通情况,再遍历 $F$ 的所有边。如果某条边连接的两个点在 $G$ 里不连通,直接删掉。
- 代价:删掉几条边,操作数就加几。
2. 加边的必要性:补齐“连通不足”
删掉所有非法边后,图 $F$ 现在的每一个连通块肯定都是图 $G$ 某个连通块的子集。这时候 $F$ 可能拆得太散了,我们需要把原本属于同一个 $G$ 分量的 $F$ 碎片给连起来。
核心优化:利用并查集(DSU)计算贡献
我们可以用并查集(Disjoint Set Union)来高效维护这种连通关系。
1. 公式推导
设删完非法边后:
- $C_G$ 是图 $G$ 的连通分量个数。
- $C_F$ 是图 $F$ 剩余部分形成的连通分量个数。
因为 $F$ 的连通分量必须合并到和 $G$ 一样,而合并 $k$ 个块最少需要 $k-1$ 条边,所以:
$$ \text{加边数} = \sum (\text{该 G 分量下的 F 碎片数} - 1) = C_F - C_G $$2. 最终操作数公式
$$ \text{Total Operations} = \text{删边数} + (C_F - C_G) $$C++ 代码实现
1 |
|

