uoj79
一般图最大匹配。
一般图最大匹配与二分图最大匹配相似,但是多了处理奇环的过程。
最大匹配的思想是:每次寻找一个未被匹配的点,走到另一个未被匹配的点,翻转路径上的所有边。
可以证明这样子翻转若干次直到没有增广路时,是最优的。
在二分图这样子一定不会经过重复的点。(画一下图可以知道)
但是一般图中有奇环,所以可能经过重复的点,算法会死循环。
所以要处理奇环。
BFS整张图,把队列中存在过的点染黑,黑点的匹配点染白。
每次从队列中取出一个点。枚举它的出点,设为v
若v在当前bfs中未被访问过:则找到了一个匹配,直接返回。
否则把它的匹配点插入队列。
若v被访问过,则发现找到了一个环。
如果这个环是偶环,则不用考虑,一定不会走重复点。
但是如果这个环是奇环,则要处理。
设环边为(u,v),lca为h
把这个环缩起来并且再次寻找增广路。
证明:如果原图为g,缩点后的图为g'
则要证明g中的增广路,g'也有
g'有的增广路,g中也有。
当g有增广路,发现h->s上的第一条边一定是匹配边。
如果不是,可以走到一个环上的未盖点继续增广。
设s->h这个路径为p。
令gs,g's为g,g'把这条路径取反后的结果。显然匹配大小不变。
若g存在增广路,则g的最大匹配值应该更大,gs的最大匹配值也应该更大,所以gs也有增广路。
设gs的增广路为c,则如果c没有经过旧环,则g's也包含c
否则,让g's的这一条增广路c走到h,则发现肯定有一种走法可以走交错边。
因为g's的匹配数和g'相同,所以根据增广路定理,g'也有增广路。
当g'有增广路,如果没走新点,则g中也有。
如果走了新点,则走新点肯定是走过匹配边,非匹配边。
匹配边肯定是和h相连的。
由于环是奇环,且匹配边交错,所以一定可以找到一种走法走到h。
uoj171
这道题是一个一般图最大匹配建模,十分巧妙。
建模的方法是:对于每个篮子拆成3个点,这3个点之间两两连边。
对于每个点向它能被放置的篮子连边。
然后求一般图最大匹配,答案再减去n。
原因是:
当一个篮子没有连匹配边(没有球被放在这个篮子里),则贡献为1
当一个篮子连了1条匹配边(有1个球被放在这个篮子里),则贡献为2
当一个篮子连了2条匹配边(有2个球被放在这个篮子里),则贡献为2
当一个篮子连了3条匹配边(有3个球被放在这个篮子里),则贡献为3
减去连的匹配边的个数。(它们的和为球的个数),
当一个篮子没有连匹配边(没有球被放在这个篮子里),则贡献为1
当一个篮子连了1条匹配边(有1个球被放在这个篮子里),则贡献为1
当一个篮子连了2条匹配边(有2个球被放在这个篮子里),则贡献为0
当一个篮子连了3条匹配边(有3个球被放在这个篮子里),则贡献为0
恰好为题目所要求的贡献。
注意,要从大->小增广,这样子在增广的过程中不会让大的点(即球点)失配(观察翻转边的过程可得)。