新手学匈牙利算法果然不容易啊。。。
#include<iostream>
#include<memory>
using namespace std;
int map[505][505]; //定义男女之间是否有同路
int vis[505]; //判断本次搜索中女生是否被带走了
int pre[505]; //pre[i]=cur 表示女生被哪个家伙带走了 cur为男生 i为第i个女生
int k,m,n;
int find(int cur) //cur表示当前男生
{
for(int i=1;i<=m;i++) //从女生中开始搜寻
{
if(map[i][cur] && vis[i]==0) //如果女生和当前男生存在可能,并且当前女生没有牵手
{
vis[i]=1; //那就把这个女生标记被牵手,vis数组只是暂时存放可能的结果。
if(pre[i]==-1 || find(pre[i])) //pre数组是真正用来存放搭配的数组,
当前女生没有牵手,或者和她搭配的男生可以找小三
{
pre[i]=cur; //当前没有被牵手的女生和这个男生搭配
return 1;
}
}
}
return 0;
}
int main()
{
while(cin>>k && k)
{
int girl,boy;
int sum=0;
memset(map,0,sizeof(map));
memset(pre,-1,sizeof(pre));
cin>>m>>n;
for(int i=0;i<k;i++)
{
cin>>girl>>boy;
map[girl][boy]=true;
}
for(int i=1;i<=n;i++)
{
memset(vis,0,sizeof(vis));
sum+=find(i);
}
cout<<sum<<endl;
}
return 0;
}