HDU - 1068 Girls and Boys
POJ - 1466 Girls and Boys
本题数据N的规模应该在(n<500)
1
<
=
N
<
=
500
1<=N<=500
1<=N<=500
最
大
独
立
集
=
节
点
数
−
(
减
号
)
最
大
匹
配
数
最大独立集=节点数-(减号)最大匹配数
最大独立集=节点数−(减号)最大匹配数
本题还要注意的一点是 mat[from][to]=mat[to][from]=1
只有这样并将结果除以二,才能得到正确结果。这是因为比如说1与2有关系与2与1有关系相同,只有都赋值为1并除以二才能得到最大匹配的正确结果。
#include<cstdio>
#include<cstring>
const int N = 510;
int match[N][N],vis[N],pre[N];
int n;
int dfs(int x)
{
for(int i=1;i<=n;i++)
{
if(!vis[i]&&match[x][i])
{
vis[i]=1;
if(pre[i]==-1||dfs(pre[i]))
{
pre[i]=x;
return 1;
}
}
}
return 0;
}
int Maxmatch()
{
memset(pre,-1,sizeof pre);
int ans=0;
for(int i=1;i<=n;i++)
{
memset(vis,0,sizeof vis);
ans+=dfs(i);
}
return ans;
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
memset(match,0,sizeof match);
for(int i=1,m,a,b;i<=n;i++)
{
scanf("%d: (%d)",&a,&m);a++;
while(m--)
{
scanf("%d",&b);b++;
match[a][b]=match[b][a]=1;
}
}
printf("%d\n",n-Maxmatch()/2);
}
return 0;
}