最大独立集=点数-最大匹配
这题是双向边所以最大匹配/2
#include<stdio.h>
#include<string.h>
int m,n,u,use[503],st[503][503],link[503];
int find(int v)
{
int i,j;
for(i=1;i<=m;i++)
{
if(st[v][i]&&!use[i])
{
use[i]=1;
if(!link[i]||find(link[i]))
{
link[i]=v;
return 1;
}
}
}
return 0;
}
int max()
{
int i,ans=0;
memset(link,0,sizeof(link));
for(i=1;i<=m;i++)
{
memset(use,0,sizeof(use));
if(find(i))
ans++;
}
return ans;
}
int main()
{
while(~scanf("%d",&m)&&m)
{
int i,j,x,y,z;
memset(st,0,sizeof(st));
for(i=1;i<=m;i++)
{
scanf("%d: (%d)",&x,&y);
for(j=0;j<y;j++)
{
scanf("%d",&z);
st[i][z+1]=1;
}
}
int zs;
zs=max();
printf("%d\n",m-zs/2);
}
return 0;
}
最小独立点集=点数——最大匹配
这题是双向边所以最大匹配/2