一般图最大匹配——带花树算法

建议看集训队论文。
更加详细的带花树实现说明
求最大匹配的过程与增广路密不可分。
增广路就是从一个未匹配点开始走到另外一个未匹配点并且中间经过的边是匹配边和非匹配边相间的路径(没有重边),不可能有连续的匹配边也没必要有连续的非匹配边。
如果路径中没有环,我们可以把增广路上的匹配边和非匹配边取反,匹配边变成非匹配边,非匹配边变成匹配边,匹配数量会+1。
那么求增广路就是求最大匹配的一个方法。
如果一个图中有奇环,那么从非匹配点出发,走一圈奇环,可能会有路径上一个点与路径中的两条非匹配边相邻的情况,这时取反就会导致两条匹配边相邻,非法。
二分图因为没有奇环,可以简单的用匈牙利算法每次dfs求增广路。
处理奇环就是一般图的最大匹配的难点。

对于一个奇环,如果我们增广路中沟通环内外的匹配边(只有一条)确定了,那么与匹配边相邻的环中点外的所有环中点会两两配对,等价于只有一个点(你只能选环中一个点出入),那么我们可以直接把奇环缩点然后化归计算,根据新图连的匹配边连得是那一条可以反推出环内的匹配状况。
所以我们就边求增广路边缩点。
实现听起来很复杂,但是仔细研究代码之后你会发现这真的十分的妙。

模板数组意义:
mat[u] \texttt {mat[u]} mat[u] u \texttt{u} u的匹配点。
nxt[u] \texttt {nxt[u]} nxt[u] u \texttt{u} u在交错树上的父亲,此处 u \texttt{u} u不一定是奇点,但是 nxt[u] \texttt{nxt[u]} nxt[u]一定是偶点。(感觉用 fa \texttt {fa} fa会不会好一点。)
F[u] \texttt {F[u]} F[u],并查集。

也就是说在缩花之后所有非匹配边的两个点(除了花托(LCA))之间都是互相父亲关系。
这样就可以保证在入环之后得到正确的方案。

但是还有一个超强的随机方式,
每次寻找简单增广路径增广。
多找几次就能过。

【UOJ 79】 一般图最大匹配
AC   Code \texttt{AC Code} AC Code

#include<bits/stdc++.h>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值