题意:
有n个女生和m个男生去,做过山车,女生可以选择和哪个男生一起,可以有多个意向,但最终一个妹子只能和一个男的一起,问最多能有多少组匹配成功
这题是二分图匹配,用匈牙利算法,第一次接触到,上网搜到相关资料才A过了
每找到一次增广路,都可以是匹配数+1,不断搜寻至没有增广路了则得到最大匹配数
#include <iostream>
#include <cstring>#include <cstdio>
using namespace std;
int map[600][600];
int n,m;
int visit[600];
int pp[600];
int solve(int a)
{
int i;
for(i=1; i<=m; i++)//开始搜寻对应男生
if(!visit[i]&&map[a][i])//如果i不在增广路上
{
visit[i]=1;
if(!pp[i]||solve(pp[i]))//如果没有匹配过或者能寻找到增广路
{
pp[i]=a;
return 1;
}
}
return 0;
}
int main()
{
int t;
//freopen("E:\\in.txt","r",stdin);
while(cin>>t&&t)
{
cin>>n>>m;
memset(map,0,sizeof(map));
memset(pp,0,sizeof(pp));
int ans=0;
while(t--)
{
int a,b;
cin>>a>>b;
map[a][b]=1;
}
for(int i=1; i<=n; i++)//从女生开始搜寻
{
memset(visit,0,sizeof(visit));
if(solve(i))//寻找增广路
ans++;
}
cout<<ans<<endl;
}
return 0;
}