二分图匹配算法汇总

这篇博客介绍了二分图匹配中的两种主要算法:匈牙利算法和Hopcroft_Karp算法。匈牙利算法适用于稠密图和稀疏图,时间复杂度为O(VE);而Hopcroft_Karp算法寻找极大最短增广路,时间复杂度优化到O(m*sqrt(n))。内容包括算法的基本思想、特点以及在寻找增广路过程中的优化技巧。
摘要由CSDN通过智能技术生成

常见的二分图匹配算法有匈牙利算法和Hopcroft_Karp算法。其实不仅二分图,即使是有奇环的图以可以用这些算法寻找匹配(边独立集),因为它们都是寻找增广路(交错轨)的算法,而图中没有增广路是得到最大匹配的充要条件(这点还不理解)。

二分图中 点覆盖数=边独立数(匹配数)进而 |V|-点独立数=边独立数 所以大都可以用二分图匹配算法解决

1、匈牙利算法

基本思想:以图(或二部图中的一部)中每个点为起点寻找一条增广路。在此之上有dfs和bfs的写法。dfs适用于稠密图,bfs适用于稀疏图,但渐进时间复杂度都是O(VE)。

dfs版

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

#define FOR(i,x,y) for(int i=(x);i!=y;++i)
#define maxn 101
int n,match[maxn],vis[maxn];
int mat[maxn][maxn];

int dfs(int u) {
    FOR(i,1,n+1) if(mat[u][i]&&!vis[i]) {
	vis[i]=1
        if(!match[i]||dfs(match[i])) {
            match[i]=u;
            match[u]=i;
            return 1;
        }
    }
    return 0;
}

int max_match() {
    int res=0;
    FOR(i,1,n+1) {
        memset(vis,0,sizeof(vis));
        if(!match[i]) res+=dfs(i);
    }
    ret
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值