二分图的最大匹配

概念

二分图的最大匹配:两个集合中的点没有公共顶点
交错路:从非匹配点开始,由匹配边和非匹配边交替组成
增广路:从非匹配点开始,以非匹配点结束的交错路

匈牙利

匈牙利算法的基本思想是找增广路,可以分为一下几个步骤

  • 遍历与现在节点相邻的边,找到另一个集合的顶点
  • 假设将图中的路是否为增广路进行反转,这样只需要遍历的点没经过遍历就可以加入
  • 如果遍历到的点已经被选中,则看看能否将它与其他点进行匹配

【模板】二分图最大匹配

bool dfs(int x){
    for(auto now:e[x]){
        if(vis[now]){//在此轮中已经遍历过了
            continue;
        }
        vis[now]=1;
        if(!match[now] || dfs(match[now])){
            match[now]=x;
            return true;
        }
    }
    return false;
}

这是部分,matchu存的是到目前为止u的匹配点。vis每轮清空,而它不会,保证了正确性

#include<vector>
#include<cstring>
#include<iostream>
using namespace std;
const int N=50010;
vector<vector<int>> e(N);
bool vis[N];
int match[N];
bool dfs(int x){
    for(auto now:e[x]){
        if(vis[now]){
            continue;
        }
        vis[now]=1;
        if(!match[now] || dfs(match[now])){
            match[now]=x;
            return true;
        }
    }
    return false;
}
int main(){
    int n,m,t;
    cin>>n>>m>>t;
    for(int i=0; i<t; i++){
        int u,v;
        cin>>u>>v;
        e[u].push_back(v);
    }
    int sum=0;
    for(int i=1; i<=n; i++){
        memset(vis,0,sizeof(vis));//match没有清空
        if(dfs(i)){
            sum++;
        }
    }
    cout<<sum<<endl;
    return 0;
}
posted @   lwr2010  阅读(3)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示