码迷,mamicode.com
首页 > 编程语言 > 详细

匈牙利算法

时间:2020-05-29 23:35:50      阅读:77      评论:0      收藏:0      [点我收藏+]

标签:second   递归   erro   fine   not   scanf   name   find   efi   

匈牙利算法

#include <iostream>
#include <vector>
#include <cstdio>
#include <cstring>
#include <queue>

using namespace std;

#define ll long long
#define pb push_back
#define fi first
#define se second

const int N = 510;
vector<int > E[N];
int vis[N];
int girls[N];
int k, n, m;

//匈牙利算法
//复杂度O(VE),适合稀疏图
//每次先初始化 vis[]数组为0
//递归找增广路,可以理解为前面的人为后面的人腾位置

void init(){
    for(int i = 1; i <= n; ++i){
        E[i].clear();
        girls[i] = 0;
    }
}

bool find(int he){

    for(auto she : E[he]){
        //这个人没被访问
        if(!vis[she]){
            vis[she] = 1;
            //如果没有归属,  或者这个男的可以换一个女生
            if(!girls[she] || find(girls[she])){
                girls[she] = he;
                return true;
            }
            vis[she] = 0; //回溯
        }
    }

    return false;
}

void solve(){

    while(~scanf("%d", &k) && k){
        scanf("%d%d", &m, &n);
        init();

        int she, he;
        for(int i = 0; i < k; ++i){
            scanf("%d%d", &she, &he);
            E[he].pb(she);
        }

        int cnt = 0;
        for(int i = 1; i <= n; ++i){
            for(int x = 1; x <= m; ++x) vis[x] = 0;
            if(find(i)) ++cnt;
        }
        printf("%d\n", cnt);
    }
}

int main(){
    
    solve();    
    //cout << "not error" << endl;
    return 0;
}

 

匈牙利算法

标签:second   递归   erro   fine   not   scanf   name   find   efi   

原文地址:https://www.cnblogs.com/SSummerZzz/p/12989895.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!