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

 

最大独立顶点集

在一个二分图中,选择一些顶点,使得所有选择的顶点集合中没有任意两个顶点之间有边相连
方法:二分图匹配,可以证明,最大独立顶点集的数目就是总顶点数减去最大匹配数(也就是每个匹配有一个边扔掉)
(摘自: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[N][N],match[N],vis[N]; 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)