Description
Input
1<=N 和M<=500.接下来的K行,每行有两个数,分别表示女生Ai愿意和男生Bj做partner。最后一个0结束输入。
Output
Sample Input
6 3 3
1 1
1 2
1 3
2 1
2 3
3 1
0
Sample Output
3
解析:直接用匈牙利算法求解。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int f[500+5]; //女和哪个男配对
bool fr[505][505]; //可用vector<int> d[505]代替
bool vis[505]; //标记数组,表示这个人搜索过
int k,n,m;
bool find(int x) //寻找x男生,返回:能否找到人去匹配
{
for (int i = 1 ; i <= m ; i++)
{
if (fr[x][i] && !vis[i])
{
vis[i] = true; //首先标记
if (f[i] == -1) //如果该女生没有和别人匹配
{
f[i] = x; //则和该男生匹配
return true; //表示匹配完成
}
else if (find(f[i])) //如果该女生匹配的男生可以找到其他的女生匹配
{
f[i] = x;
return true;
}
}
}
return false;
}
int main()
{
while (~scanf ("%d",&k) && k)
{
scanf ("%d %d",&n,&m);
memset(f,-1,sizeof(f)); //初始化,表示没有和任何人配对
memset(fr,false,sizeof(fr)); //初始化
for (int i = 1 ; i <= k ; i++)
{
int x,y;
scanf ("%d %d",&x,&y);
fr[x][y] = true;
}
int ans = 0; //表示已经配对的男生数
for (int i = 1 ; i <= n ; i++)
{
memset(vis,false,sizeof(vis));
if (find(i))
ans++;
}
printf ("%d\n",ans);
}
return 0;
}
5017



被折叠的 条评论
为什么被折叠?



