这里讲解匈牙利算法讲得挺好的:去了解匈牙利算法
匈牙利算法的模板题,也是我的第一道二分图求最大匹配的题。
/*************************************************************************
> File Name: main.cpp
> Author:Eagles
> Mail:None
> Created Time: 2018年09月13日 星期四 16时53分50秒
> Description:HDU2063
************************************************************************/
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
#define N 510
bool relation[N][N];
int girl[N];//男同学配对的女孩
bool used[N];
int k,m,n;
int dfs(int x)//男同学x
{
for (int i=0; i<m; i++)
{
if (!used[i]&&relation[i][x])//如果该女同学没被选,并且二者有关系
{
used[i]=true;//选她
if (girl[i]==-1||dfs(girl[i]))//如果这个女孩以前没跟人配对,或者,就算配对了,经过调整满足条件
{
girl[i]=x;//该女孩与该男子配对
return 1;
}
}
}
return 0;
}
void init()
{
scanf("%d%d",&m,&n);
for (int i=0; i<k; i++)
{
int a,b;
scanf("%d%d",&a,&b);
relation[a-1][b-1]=true;//这里不能用无向的!!也就是不能写成:relation[a-1][b-1]=relation[b-1][a-1]=true
//我也不知道为什么,反正那样写就WA了(可能不是方阵的缘故)
}
}
int main()
{
while (~scanf("%d",&k)&&k)
{
memset(relation,false,sizeof(relation));
memset(girl,-1,sizeof(girl));
init();
int sum=0;
for (int i=0; i<n; i++)
{
memset(used,false,sizeof(used));//新的一个男同学,需要先清零,让他先选择,其他已经配对了的做适当调整,看能够成功
if (dfs(i))//如果可以
sum++;
}
printf("%d\n",sum);
}
return 0;
}