#include"stdio.h"
#include"string.h"
int
link[1010];
int
b;
bool
map[1010][1010],mark[1010];
int
find(
int
k)
{
int
i;
for
(i=1;i<=b;i++)
{
if
(mark[i]&&map[k][i])
{
mark[i]=0;
if
(link[i]==0||find(link[i])==1)
{
link[i]=k;
return
1;
}
}
}
return
0;
}
int
main()
{
int
g,t,i,ans,x,y,r;
r=1;
while
(
scanf
(
"%d%d%d"
,&g,&b,&t),g+b+t)
{
memset
(map,
true
,
sizeof
(map));
for
(i=0;i<t;i++)
{
scanf
(
"%d%d"
,&x,&y);
map[x][y]=0;
}
ans=0;
memset
(link,0,
sizeof
(link));
for
(i=1;i<=g;i++)
{
memset
(mark,
true
,
sizeof
(mark));
if
(find(i))
ans++;
}
printf
(
"Case %d: "
,r);
printf
(
"%d\n"
,g+b-ans);
r++;
}
return
0;
}
描述:思路:反键边求最小点集覆盖key,boys+girls-key 就是答案。 根据题意:反建边后,每条边代表的是该男孩和该女孩不认识, 求的最小点集,把这些点去掉后即所有反建的边被去掉, 则剩余的就是男女之间都相互认识。。
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2458