题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2063
二分图匹配匈牙利算法详解:http://blog.csdn.net/dark_scope/article/details/8880547
做法:
感觉跟最大流差不多,所以挑战上也给出了一种方法建边,直接转换成最大流做。
主要就是一个找增广路。。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
#define M 509
vector<int> G[M];
int n,m,k;
int match[M]; //女生所匹配的男生
bool used[M];
bool dfs(int u) //尝试给u这个男生匹配一个女生
{
for(int i = 0;i < G[u].size();i++) //查找与这个男生所连接的女生
{
int v = G[u][i];
if(!used[v]) //女生在该次寻找中是否试图修改过
{
used[v] = true;
if(match[v] == -1 || dfs(match[v])) //如果这个女生还没有匹配男生,或者可以将与其匹配的男生换一个女生
{
match[v] = u;
return true;
}
}
}
return false;
}
int bi()
{
int res = 0;
memset(match,-1,sizeof(match));
for(int i = 1;i <= n;i++)//对每个男生进行查找,试图匹配一个女生
{
memset(used,0,sizeof(used));
if(dfs(i)) res++;
}
return res;
}
int main()
{
while(scanf("%d",&k) == 1)
{
if(k == 0) break;
scanf("%d %d",&n,&m);
for(int i = 0;i <= n;i++) G[i].clear();
for(int i = 0;i < k;i++)
{
int a,b;
scanf("%d %d",&a,&b);
G[a].push_back(b);
}
printf("%d\n",bi());
}
return 0;
}