二分图匹配 洛谷 [P3386]

最为经典的匈牙利算法

匈牙利算法应用了增广路的性质,实际上就是通过搜索可行的增广路,每搜到一条,匹配数++
还可以应用配对的方法去理解,此算法的时间复杂度 (V*E),比较慢,但是实现较为简单。

dfs版

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
const int MAXN=2000005;
int init(){
    int rv=0,fh=1;
    char c=getchar();
    while(c<'0'||c>'9'){
        if(c=='-') fh=-1;
        c=getchar();
    }
    while(c>='0'&&c<='9'){
        rv=(rv<<1)+(rv<<3)+c-'0';
        c=getchar();
    }
    return rv*fh;
}
struct edge{
    int to,nxt;
}e[MAXN];
int n,m,num,nume,head[1005],match[1005];
bool f[1005];
void adde(int from,int to){
    e[++nume].to=to;
    e[nume].nxt=head[from];
    head[from]=nume;
}
bool hungarian(int u){
    for(int i=head[u];i;i=e[i].nxt){
        int v=e[i].to;
        if(!f[v]){
            f[v]=1;
            if(!match[v]||hungarian(match[v])){//核心
                match[v]=u;
                return 1;
            }
        }
    }
    return 0;
}
int main(){
    n=init();m=init();num=init();
    for(int i=1;i<=num;i++){
        int u=init(),v=init();
        if(u>n||v>m) continue;
        adde(u,v);
    }
    int ans=0;
    for(int i=1;i<=n;i++){
        memset(f,0,sizeof(f));
        if(hungarian(i)) ans++; 
    }
    cout<<ans<<endl;
    return 0;
}

bfs性能稍好,但没有时间复杂度上的差异

Hopcroft-Carp 算法

时间复杂度 O(sqrt(V)*E)

转载于:https://www.cnblogs.com/Mr-WolframsMgcBox/p/8244166.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值