您的位置:首页 > 其它

zoj 1137 Girls and Boys(poj 1466)(最大独立点集)

2011-03-20 01:06 351 查看
 

最大独立顶点集

在一个二分图中,选择一些顶点,使得所有选择的顶点集合中没有任意两个顶点之间有边相连
方法:二分图匹配,可以证明,最大独立顶点集的数目就是总顶点数减去最大匹配数(也就是每个匹配有一个边扔掉)
(摘自:http://my.opera.com/IloveLunamaria/blog/show.dml/810972)
就是说:极小覆盖点集和极大独立点集互补
这题题我一直没看懂,所以一直纳闷为啥是  n-cnt/2  ,后来看懂题了,才知道原来这题的二部图两边集合的点都一样,所以相当于最大匹配求了两次,所以要减去 cnt 的一半,纠结了好久……
#include<stdio.h>
#include<string.h>
#define N 1001
int n,map

,match
,vis
;
int dfs(int x)
{
int i;
for(i=0;i<n;i++)
{
if(map[x][i] && !vis[i])
{
vis[i]=1;
if(!match[i] || dfs(match[i]))
{
match[i]=x;
return 1;
}
}
}
return 0;
}
int main()
{
int m,a,i,cnt,x;
while(~scanf("%d",&n))
{
memset(map,0,sizeof(map));
for(i=0;i<n;i++)
{
scanf("%d: (%d)",&x,&m);
while(m--)
{
scanf("%d",&a);
map[x][a]=1;
}
}
memset(match,0,sizeof(match));
for(cnt=0,i=0;i<n;i++)
{
memset(vis,0,sizeof(vis));
if(dfs(i)) cnt++;
}
printf("%d/n",n-cnt/2);
}
return 0;
}
 
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ini