题目大意
定义一个点的集合
S
为团,当且仅当对于任意S中的两个点,都有边直接连接。定义极大团表示这个集合是团,并且不存在另外一个团包含它。现在给定一副特殊的图,图中的每个点恰好属于两个极大团,给定每个点属于的两个极大团的编号,问这个图的最大匹配是多少,以及其中一种匹配方案。设图中有
N
个点,总共有M个极大团。
数据范围
N≤2∗105,M≤2∗104
题解
我们不妨将点看成边,将每个极大团看成一个点,那么对于一个点
i
,若他属于极大团a,b,我们就给
a,b
连上一条编号为
i
的边。之后我们都将极大团称为点。
对于一个联通块,设块中有Size条边,那么这个联通块的最大匹配的上界就是
⌊Size2⌋
,因为一个匹配需要两条边,接下来就是要找到一种算法使得这个连通块能达到上界,可以发现的是,原问题等价于我们给每条无向边确定一个方向,最后最大化入度为偶数的点的数量。
那么我们递归这个联通块,弄出一个Dfs树,对于一条反祖边或者树上的边
(u,v)
,我们可以强制使得这条边的方向就是
v
,最后再进行调整。设当前我们递归完u的子树,其中有
cu
条边指向了
u
,并且每条回到u的返祖边都已经确定了方向了。假如
cu
为偶数,那么我们已经达到目的了,不需要调整,假如
cu
为奇数,若
u
不是根节点,那么必然存在一条从父亲到u的边,我们可以将这条边反向,那么
cu
就变成偶数了。所以假如
u
不为根,我们总是能获得一种合法的方案使得cu为偶数。
那么对于一个连通块,假如原来有
Size
条边,
Size
为偶数,并且除根以外所有点入度均为偶数,那么根的入度也为偶数,贡献恰好为
Size2
,若
Size
为奇数,除根以外入度为偶数,但根无法调整,依然为奇数,但贡献依然恰好为
⌊Size2⌋
,因此这个算法是正确的。
最终若一条边
i
指向了点j,我们就将
i
塞入j的匹配列表中,输出答案时只需要将
j
的匹配列表中的点逐个匹配即可。
复杂度为O(M+N)。