二分图匹配 H-K 算法

二分图匹配H-K算法是一种高效的优化算法,通过多路增广将复杂度降低到O(√|V|)。该算法与Dinic算法的主要区别在于增广起点,HK算法从每个未匹配点开始,而Dinic则从源点。交错轨思想在二分图匹配中至关重要。代码实现中有两个关键细节,涉及增广路径的判断和匹配操作的时机。对于有向图的最小路径覆盖问题,该算法能在限制时间内完成。
摘要由CSDN通过智能技术生成

这个算法的复杂度和很多最大流的优化算法接近,因为都是多路增广的算法。

首先 bfs 多路增广,然后 dfs 增广每一个未匹配点。据说这样可以使增广次数从 O(|V|) 降为 O(√|V|) 。

感觉跟 dinic 的差别就是:dinic 是从源点开始增广,而 HK 是从每一个未匹配点开始增广。而在二分图中 dinic 的源点必然连向每一个前一部图的点,所以又是很像。

再者就是交错轨的思想,也就是二分图匹配中的增广路。感觉这是一种专门为此类问题所设的方法,同于 DLX 之于精确覆盖一样。

有向图的最小路径覆盖,|V| <= 200000, |E| <= 500000,0.3 s 左右跑过无压力。

下面上代码:

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <climits>
#include <iostream>
#include <algorithm>

typedef long long int64;
typedef unsigned int uint;
typedef unsigned long long uint64;

#define swap(a, b, t) ({t _ = (a); (a) = (b); (b) = _;})
#define MAX(a, b, t) ({t _ = (a), __ = (b); _ > __ ? _ : __;})
#define MIN(a, b, t) ({t _ = (a), __ = (b); _ < __ ? _ : __;})

#define maintype int
#define max(a, b) MAX(a, b, maintype)
#
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值