模型:有两个集(A)和(B),现在要从两个集合中选出一些,但是会有一些关系限制,对于每个限制((i,j)),表示(A)中的第(i)个元素和(B)中的第(j)个元素不能同时选。试求出最多能选几个元素。
Solution
考虑二分图。
建立超级源点(S)和超级汇点(T)。
对于所有(x in A),连边((S,x,1))
对于所有(x in B),连边((x,T,1))
对于每个限制((i,j)),连边((A_i,B_j,+infty))
然后跑最大流即可。
简单证明:
首先我们考虑将所有的元素全部选上,然后再删掉最小数量的元素。
发现若(S)与(T)不连通,那么这个选择就是正确的。于是考虑到最小割。
在上面建图过程中,割掉的边不会是限制边,换句话说,一定是简单割。
那么我们只需要跑一下最小割,未被割掉的边所代表的点就是选择方案。
因为对于一组限制((i,j)),如果((S,A_i))和((B_j,T))未被割掉,那么(S)与(T)仍然联通,与割的性质不符。
因为最大流最小割定理,所以等同于跑一遍最大流。
证毕。