匈牙利算法

匈牙利算法(Hungarian method)是由匈牙利数学家Edmonds于1965年提出,因而得名。匈牙利算法是基于Hall定理中充分性证明的思想,它是二部图匹配最常见的算法,该算法的核心就是寻找增广路径,它是一种用增广路径求二分图最大匹配的算法。

之前在学离散的时候学习到二分图的时候没听说过这个算法,后来校级c程序设计大赛用到了二分图匹配才学习这个算法。

这个算法的目的就是找到使二分图能一 一配对的最大值。

比如给男女配对的时候要尽可能多的将互有好感的男女配对。

1、从编号为1的男生开始

2、找与他有暧昧关系的女生,标记女生。

3、判断该女生是否有男朋友,如果没有那这个男生就可以做她男朋友,返回真。

4、否则判断是否她的男朋友能不能从他其它有暧昧的女生里找到女朋友。(即重复2、3、4(递归))

5、可以,重新牵手,返回真。

6、否则返回假。

例题

问题 E: DATE ALIVE
时间限制: 1 Sec  内存限制: 128 MB
提交: 47  解决: 17
[提交][状态][讨论版]
题目描述

五河士道家里的精灵越来越多了,而每一个精灵都想和他有一个约会。然而五河士道却只有一个,无奈之下只能使出分身帮自己解围。

不过并不是所有的精灵都同意这样做,有些精灵不愿意和士道分身进行约会,也有部分精灵同时选择同一个分身进行约会。

假设有N个分身,精灵的数量为M,可能的约会组合有K组。

设N=3,M=5,K=5,可能的组合为1-1,1-3,2-4,3-4,3-5(如下图),为了避免冲突,我们最多可以选择1-1,2-4,3-5一共三种组合(或者是1-3,2-4,3-5)

那么请设计一个程序判断每一次可能的组队最多能确定多少队伍?最后,让我们的约会开始吧~

输入

输入N,M,K

N,M,K为正整数

1<=N<=500

1<=M<=500

接下来K行,输入u,v,表示uv之间愿意组队

u在N的范围内,v在M的范围内

输出

输出最大组队数目

样例输入
3 5 5
1 1
1 3
2 4
3 4
3 5
样例输出
3
 1 #include<iostream>
 2 #include<stdio.h>
 3 #include<string.h>
 4 #include<algorithm>
 5 #include<vector>
 6 using namespace std;
 7 int n,m,k;
 8 bool gx[550][550];
 9 int girl[550];
10 bool used[550];
11 bool dfs(int i){
12     for(int j=1;j<=m;j++){
13         if(gx[i][j]&&!used[j]){
14             used[j]=1;  //标记,避免后面无法跳出递归
15             if(!girl[j]||dfs(girl[j])){
16                 girl[j]=i;
17                 return true;
18             }
19         }
20     }
21     return false;
22 }
23 int hungary(){
24     int cnt=0;
25     for(int i=1;i<=n;i++){
26         memset(used,0,sizeof(used)); //清除标记
27         if(dfs(i))  cnt++;
28     }
29     return cnt;
30 }
31 int main(){
32     cin>>n>>m>>k;
33     while(k--){
34         int x,y;
35         scanf("%d%d",&x,&y);
36         gx[x][y]=true;
37     }
38     cout<<hungary()<<endl;
39     return 0;
40 }


题目链接http://oj.jxust.edu.cn/problem.php?cid=1251&pid=4

匈牙利算法其他详解:赞一个!http://blog.csdn.net/dark_scope/article/details/8880547


原文地址:https://www.cnblogs.com/ISGuXing/p/8012478.html