zoukankan      html  css  js  c++  java
  • [模板] 匈牙利算法

    二分图匹配,寻找增广路。
    洛谷这个模板题真的毒瘤。

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #define R register
    using namespace std;
    
    const int MAXN=1000005;
    
    inline int read_d(){
        int s=0;
        char c;
        while(c=getchar(),c<'0'||c>'9');
        while(c<='9'&&c>='0'){
            s=s*10+c-'0';
            c=getchar();
        }
        return s;
    }
    
    struct Edge{
        int next,to;
    }e[MAXN];
    int ecnt,head[MAXN];
    inline void add(int x,int y){
        e[++ecnt].next = head[x];
        e[ecnt].to = y;
        head[x] = ecnt;
    } 
    
    int mann,girn,m;
    
    bool vis[MAXN];
    int match[MAXN];
    bool hungary(int now){
        for(R int i=head[now];i;i=e[i].next){
            int v=e[i].to ;
            if(!vis[v]){
                vis[v]=1;
                if(!match[v]||hungary(v)){
                    match[v]=now;
                    return true;
                }
            }
        }
        return false;
    }
    
    int main(){
        mann=read_d();
        girn=read_d();
        m=read_d();
        for(R int i=1;i<=m;i++){
            int x,y;
            x=read_d();
            y=read_d();
            if(x>mann||y>girn) continue;
            add(x,y);
        }
        int cnt=0;
        for(R int i=1;i<=mann;i++){
            memset(vis,0,sizeof(vis));
            if(hungary(i)) cnt++;
        }
        cout<<cnt<<endl;
        return 0;
    } 

    本文来自博客园,作者:GhostCai,转载请注明原文链接:https://www.cnblogs.com/ghostcai/p/9247477.html

  • 相关阅读:
    算法提高 身份证号码升级
    枚举排列
    排列数
    算法训练 K好数
    算法训练 前缀表达式
    算法训练 区间k大数查询
    最大最小公倍数
    Anagrams问题
    Uiautomator 2.0
    Uiautomator 2.0
  • 原文地址:https://www.cnblogs.com/ghostcai/p/9247477.html
Copyright © 2011-2022 走看看