zoukankan      html  css  js  c++  java
  • 匈牙利匹配

    // 一种简单而美的算法   匈牙利交朋友算法求最大匹配,
    #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;
    }
    
  • 相关阅读:
    两种方法生成随机字符串
    cmd命令总结
    NOI前乱写
    多校模拟9
    字符串 口胡
    HEOI2020游记
    省选模拟104
    省选模拟103
    省选模拟102
    省选模拟101
  • 原文地址:https://www.cnblogs.com/yesuweiYYYY/p/15518144.html
Copyright © 2011-2022 走看看