匈牙利匹配

// 一种简单而美的算法   匈牙利交朋友算法求最大匹配,
#include<bits/stdc++.h>
using namespace std;
const int _ = 1e6+10;
vector<int>g[_];//向量存边
int b[_],f[_];//b==vis,表示在当前伦次下是否被访问过,(访问x=find(x))
// f 匹配点。
bool find(int u){
    for(auto v:g[u]){
        if(!b[v]){
            b[v]=1;//未访问过,打上访问标记
            if(!f[v]||find(f[v]))return f[v]=u,1;
            // 若此点未匹配或者 在bfs 搜索 搜索到未访问的点,设置匹配。 由于存在b标记,单次搜索至多只会遍历全图的便,即e次。
        }
    }
    return 0;
}
int n,m,e;
int main(){
    cin>>n>>m>>e;//A点数n,B点数m,边数e
    while(e--){
        int x,y;cin>>x>>y;
        g[x].push_back(y);// 只有存单向便即可
    }
    int ans= 0;
    for(int j=1;j<=m;j++)f[j]=0;//清空匹配
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++)b[j]=0;//情况标记
        if(find(i))ans++;//搜索+统计答案
    }
    cout<<ans;
    return 0;
}
原文地址:https://www.cnblogs.com/yesuweiYYYY/p/15518144.html