一般图最大匹配

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

恰好为题目所要求的贡献。

注意,要从大->小增广,这样子在增广的过程中不会让大的点(即球点)失配(观察翻转边的过程可得)。

原文地址:https://www.cnblogs.com/cszmc2004/p/12970371.html