码迷,mamicode.com
首页 > 其他好文 > 详细

hdu 1068 Girls and Boys 最大独立点集 二分匹配

时间:2017-11-17 21:08:46      阅读:118      评论:0      收藏:0      [点我收藏+]

标签:play   一点   onclick   tar   print   false   --   return   二分匹配   

题目链接: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 }
View Code

 

hdu 1068 Girls and Boys 最大独立点集 二分匹配

标签:play   一点   onclick   tar   print   false   --   return   二分匹配   

原文地址:http://www.cnblogs.com/lemonbiscuit/p/7853150.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!