HDU 1068 Girls and Boys(最大独立集)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1068

题目大意:有n个人,一些人认识另外一些人,选取一个集合,使得集合里的每个人都互相不认识,求该集合中人的最大个数。

解题思路:这题就是求最大独立集,但是这并不是两个集合,而是一个集合,所以求出最大匹配后需要/2,然后代公式:最大独立集=N-最大匹配。

代码:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<vector>
 5 #include<algorithm>
 6 using namespace std;
 7 const int N=1e5+5;
 8 vector<int>v[N];
 9 
10 int n;
11 int link[N];
12 bool vis[N];
13 
14 bool dfs(int u){
15     for(int i=0;i<v[u].size();i++){
16         int t=v[u][i];
17         if(!vis[t]){
18             vis[t]=true;
19             if(link[t]==-1||dfs(link[t])){ //如果t尚未被匹配,或者link[t]即x可以找到其他能够替代的点,则把t点让给u匹配
20                 link[t]=u;
21                 return true;
22             }
23         }
24     }
25     return false;
26 }
27 
28 int max_match(){
29     memset(link,-1,sizeof(link));
30     int ans=0;
31     for(int i=0;i<n;i++){
32         memset(vis,false,sizeof(vis));
33         if(dfs(i)) ans++;
34     }
35     return ans;
36 }
37 
38 int main(){
39     while(~scanf("%d",&n)){
40         for(int i=0;i<=n;i++) v[i].clear();
41         memset(link,-1,sizeof(link));
42         for(int i=0;i<=n-1;i++){
43             int num,t;
44             scanf("%d: (%d)",&num,&t);
45             for(int j=1;j<=t;j++){
46                 int x;
47                 scanf("%d",&x);
48                 v[num].push_back(x);
49             }
50         }
51         printf("%d\n",n-max_match());
52     }
53     return 0;
54 }

 

posted @ 2018-04-11 00:17  Yeader  阅读(171)  评论(0编辑  收藏  举报