这题要用二分图。
二分图的解释实在懒得写了。麻烦各位自己百度一下吧。二分图理解很简单,难点在代码的理解,代码的注释我会给齐的。
#include <iostream>
using namespace std;
int K, M, N;
int Lu[1001][1001], Hui[1001], Yi[1001]; //二维数组Lu保存了男女之间能否配对的信息(实现见29行的for循环);Hui则表示男生是否被匹配;Yi在下面解释
int find(int girl) //先看下面的main主函数再回头看这个比较好
{
for (int i = 1; i <= N; i++) //历遍男生
{
if (Lu[girl][i] && !Yi[i]) //如果该男生可与女生配对且此男生未被配对(数组Yi的作用在此,难点就在理解数组Yi作用)
{
Yi[i] = 1;
if (!Hui[i] || find(Hui[i])) //数组Y其实为这里服务,假如前面的!Hui条件不成立,即男生已经被抢走,那么执行find(Hui[i])(下接)
{ //执行find(Hui[i])的目的是为了尝试是否可以为前一位女生重新找一个,方便为现在这个女生腾出她之前占有的男生(下接)
Hui[i] = girl; //因为此时还在find函数中循环,所以数组Yi未被初始化,Yi[i]被此时的女生占领,前一位女生就要跳过这个男生找下一个
return 1;
}
}
}
return 0;
}
int main()
{
while (cin >> K && K)
{
memset(Lu, 0, sizeof(Lu));
memset(Hui, 0, sizeof(Hui));
cin >> M >> N;
int girl, boy, sum = 0;
for (int i = 1; i <= K; i++)
{
cin >> girl >> boy;
Lu[girl][boy] = 1;
}
for (int i = 1; i <= M; i++)
{
memset(Yi, 0, sizeof(Yi));
sum += find(i);
}
cout << sum << endl;
}
return 0;
}