一般图最大匹配——带花树
所谓花,就是如下图所示的一个奇环: 本文中粗边代表现在的匹配边,细边代表该点的前驱(后文会讲解前驱是什么,现在只需要知道每个点和它的前驱在原图中一定是有边的)。 如图所示,一朵包含 \(2k+1\) 个点的花一定至多包含 \(k\) 条匹配边,于是总会剩下一个未匹配的点,上图中即为 \(1\) 号点。 那么我们可以发现,如果有另外一个点想要与花中的某个点 \(v\) 匹配,那么有两种情况:1、 \(v\) 是未匹配的点(即1号点),那么直接与 \(v\) 匹配即可。2、 \(v\) 是已经匹配的点,这时只要将花中的匹配状况修改,使得 \(v\) 变成未匹配的那个点即可。 综上所述,只要花中的点没有向外匹配,我们总是可以使得外部的一个点和花中任意一个点匹配,因此花的性质和点其实很相似。我们将花缩成一个点来处理,就可以解决出现奇环的问题。以上思想就是带花树算法的核心。 ==================总之分割一下好了================== 带花树算法的过程其实和 \(bfs\) 版本的匈牙利是很相似的,都是找出一个交错树,交错树可能长这样(注意每个蓝色点可能有多个橙色儿子,但是每个橙色点只能有一个蓝色儿子): 其中1号点就是我们尝试增广的节点,在这里我们给每一个节点一个 \(type\) 值,若该点不在交错树中,它的 \(type\) 值为 \(0\) ,否则为 \