AGC029F

题意

给定\(n-1\)\(\{1,2,...,n\}\)的子集\(E_i\)\(E_i\ge 2\)),每个子集选择两个点连边,使得最后形成一棵树。

做法

考虑二分图:\(u\longrightarrow id(i)(u\in E_i)\)

假设我们得到了解,观察其在二分图上的样子是怎样的?

对于\(E_i\),选出来的为\((u,v)\),二分图上选出\((u,i)(v,i)\)
由于最终构成了一棵树,对于任意右侧集合\(S\),选出的左边的点集并大小\(\ge |S|+1\)(1)

这等价于,若我们删去左侧任意节点,那么对于右侧集合\(S\),选出的左边的点集并\(\ge |S|\)
根据\(\text{hall}\)定理,此时\((n-1)-(n-1)\)二分图有完美匹配。

那么我们先网络流跑一遍完美匹配,如果不存在完美匹配显然不合法。
注意,若存在完美匹配,不一定合法,因为不一定满足(1)

我们假设满足(1),可以构造一组解:

\(1\)为根\(\text{dfs}\)
每次遍历\(u\)所在的\(E_i\)(集合\(i\)还没有访问过),然后继续往\(i\)的匹配边的点\(\text{dfs}\)
如果满足\(N(S)\ge |S|+1\),那么一定能找到\(i\)
假设现在已经用过了\(T\)集合,\(T不为全集\),无法在已经遍历的点找到另外的集合,那么\(N(U-T)\le |U-T|\),与假设不符。(其中\(U\)\(\{1,2,\ldots,n-1\}\)即全集)

posted @ 2020-05-24 18:07  Grice  阅读(117)  评论(0编辑  收藏  举报