hdu 1068 Girls and Boys 最大独立点集 二分匹配
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1068
思路:
求一集合满足,两两之间没有恋爱关系
思路:
最大独立点集=顶点数-最大匹配数
这里给出的关系,看似有向边,实则是无向边,那么按照二分匹配处理的话,相当于一个人看作两个人来用,最后还是顶点数目-最大二分匹配数
因为之间一个人当作两个人用,二分匹配数目减半,即 = n - match()/2
或者也可以写成 = ( 2n - match() )/2 更容易理解
题目中n的大小没有说明,最好开大一点,最后测得的大小在500以内
代码:
1 #include <stdio.h> 2 #include <string.h> 3 const int maxn=205; 4 int n; 5 int g[maxn][maxn],vis[maxn],who[maxn]; 6 bool F(int x) { 7 for(int i=0; i<n; ++i) { 8 if(g[x][i]&&!vis[i]) { 9 vis[i]=1; 10 if(who[i]==-1||F(who[i])) { 11 who[i]=x; 12 return true; 13 } 14 } 15 } 16 return false; 17 } 18 int main() { 19 while(~scanf("%d",&n)) { 20 memset(g,0,sizeof(g)); 21 memset(who,-1,sizeof(who)); 22 int temp=n,u,v,num; 23 while(temp--) { 24 scanf("%d: (%d)",&u,&num); 25 while(num--) { 26 scanf("%d",&v); 27 g[u][v]=g[v][u]=1; 28 } 29 } 30 int sum=0; 31 for(int i=0; i<n; ++i) { 32 memset(vis,0,sizeof(vis)); 33 if(F(i)) sum++; 34 } 35 printf("%d\n",n-sum/2); 36 } 37 return 0; 38 }