hdu 2064(二分图最大匹配)
匈牙利算法求二分图最大匹配
#include<bits/stdc++.h>
using namespace std;
int line[505][505],used[505],nxt[505];
int k,m,n;
bool ifind(int x)
{
for(int i=1;i<=n;i++)//给x男生找妹子,依次访问所有妹子
{
if(line[x][i]&&!used[i])//如果互相喜欢而且没被标记,used[i]==1,则i妹子已经名花有主
{
used[i]=1;
if(nxt[i]==0||ifind(nxt[i]))//i妹子无喜欢人或i妹子喜欢的人可以喜欢其他人(相当于给x男生腾个位子)
{
nxt[i]=x;
return true;
}
}
}
return false;
}
int match()
{
int ans=0;
for(int i=1;i<=m;i++)//给m给男生找妹子
{
memset(used,0,sizeof(used));
if(ifind(i))
ans++;
}
return ans;
}
int main()
{
std::ios::sync_with_stdio(false);
while(cin>>k&&k)
{
cin>>m>>n;
memset(line,0,sizeof(line));
memset(used,0,sizeof(used));
memset(nxt,0,sizeof(nxt));
for(int i=1;i<=k;i++)
{
int a,b;
cin>>a>>b;
line[a][b]=1;
}
cout<<match()<<endl;
}
return 0;
}