口胡一般图最大匹配
昨天教练讲了带花树,但是没听懂,于是来口胡一个
首先带花树的思想很简单,将奇环缩为一个点,然后跑二分图最大匹配,最后解开奇环。可以自己去想一想奇环套奇环是否合理。
怎么找到奇环?爆搜即可。具体地,爆搜出来的时候能搜到一颗dfs树,每遍历一条边就查看一下下一个节点是否遍历过和是否能与其产生奇环。
如果产生了奇环,就在dfs树上寻找LCA,然后把路径上的点全部缩起来变成一个新的节点,需要注意此时新节点仍可能与祖先构成奇环(比如祖先形成了一个偶环但是你缩点的时候缩了一条边进去),所以需要对每个节点开两个set来存祖先方向的连接着的深度为奇数或偶数的节点。
在缩点的时候将这些信息合并起来,注意需要同时将set启发式合并。然后判断自身是否会寄,如果会寄继续这个过程直到目前没有奇环。
重复搜索下去就能够得到一张二分图了。需要注意的是你得将这张二分图保存下来,并且上面的边的节点应该包含缩过点的环。
具体地,在缩环的时候记录每个节点属于哪个环,如果一条边两个节点属于同一个环就说明应该被去掉,否则在新图中连接两个环或环和节点对应的边。
对着这张二分图直接跑就可以跑出来结果,然后在缩环的时候记录一下原环上的节点以及边的顺序,解环的时候直接暴力丢一个解进去即可。
复杂度看上去可以做到 \(O(n\log^2n+m\sqrt{n})\)。