AGC029F Construction of a tree

\(\color{#FF003F}{\texttt {AGC029F}}\)
神题。
观察下什么时候会无解,对于任意一个元素是给定集合的集合,若左侧与其中任意一个集合相连的点的数量 \(\geq\) 集合大小,则无解。即若存在 \(\{E_i | 1 \leq i \leq n\}\) 的一个子集 \(S\),若 \(f(S)=|\{u \in E \in S\}|<=|S|\),则无解。
这显然是必要条件,否则会连出环。

构造二分图,把 \(n\) 个点放在左边,\(n-1\) 个集合放右边,点向包含的所有集合连边。如果此二分图不存在完美匹配,答案肯定是 \(-1\)
反证:如果可以构造出,那么可以让每条树上的边与深度较深的点匹配,匹配数是 \(n-1\)

否则左侧有且仅有一个未匹配点,从它开始dfs,每次找与其相连的未经过的右侧点,与它的对应匹配点连边,递归下去dfs。
考虑此方法的正确性,我们需要证明这样构造出的是一棵树 且 有解不会构造不出。

这样构造出的是一棵树:显然会有 \(n-1\) 条边,因为一个右侧点只会与一个左侧点匹配,所以构造不出环。

有解不会构造不出:假设这种情况存在,那么存在一个时刻,存在右侧剩余点和左侧剩余点,且左侧经过的点与右侧剩余点无边。
因为我们同时 dfs 到一个右侧点和与其匹配的左侧点,所以左侧经过点的数量等于右侧经过点的数量+1(一开始的未匹配点),右侧剩余点数量等于左侧剩余点数量。令 \(S\) 是右侧剩余点的集合,因为 \(S\) 中的点都有匹配点且左侧经过的点与右侧剩余点无边,所以右侧剩余点和左侧剩余点相互匹配,则 \(f(S)=|S|\),所以无解。

代码

\(\color{#FFFFFF}{我要妹子\operatorname{/kel}}\)

猜你喜欢

转载自www.cnblogs.com/Frame233/p/12632262.html