hdu 2063 给男女匹配 (匈牙利算法)

时间:2023-03-09 14:53:52
hdu  2063     给男女匹配 (匈牙利算法)

来源:http://acm.hdu.edu.cn/showproblem.php?pid=2063

题意:

有k个组合a,b组合,代表a愿意与b坐过山车,共m个女生 n个男生,问有多少个满意的匹配

题解:

这是一道匈牙利算法的裸题,用递归询问是否能安排好某个女生,如果能就ans++

注意,在同一回合的询问中,某个女生只寻找一次其它男生,第二次寻找时一定无法找到,直接返回0就行

这是我第二次做这道题,在前几个月已经做过,没想到这就是传说中的二分图  Orz

#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
const int maxn = 500+5; int part[maxn];
bool vi[maxn];
int n,m,k; vector<int>ma[maxn]; bool is_ok(int x)
{
if(vi[x]==0)vi[x]=1;
else return 0;
for(int i=0;i<ma[x].size();i++)
{
if(part[ma[x][i]]==0||is_ok(part[ma[x][i]]))
{
part[ma[x][i]]=x;
return 1;
}
}
return 0;
} int main()
{
while(scanf("%d",&k)!=EOF)
{
if(k==0)break;
scanf("%d %d",&m,&n);
int ans=0;
for(int i=1;i<maxn;i++)
{
ma[i].clear();
part[i]=0;
}
for(int i=1;i<=k;i++)
{
int a,b;
scanf("%d %d",&a,&b);
ma[a].push_back(b);
}
for(int i=1;i<=m;i++)
{
for(int j=1;j<=m;j++)vi[j]=0;
if(is_ok(i))
ans++;
}
printf("%d\n",ans);
}
return 0;
}