hdoj1068 Girls and Boys(二分图的最大独立集)

题意:有n个人,要彼此认识。选择一个集合,使得集合里的每个人相互不认识。求集合中人数的最大值。

 

求二分图的最大独立集。

公式:最大独立集=顶点数-最大匹配

 

这个题目中因为集合是一个,所以求出最大匹配数后要除以2。

 1 #include<iostream>
 2 #include<cstring>
 3 #define maxn 1005
 4 using namespace std;
 5 int n;
 6 int map[maxn][maxn],used[maxn],match[maxn];
 7 void init(){
 8     memset(map,0,sizeof(map));
 9     int x,k,y;
10     for (int i=0;i<n;i++){
11         scanf("%d: (%d) ",&x,&k);
12         for (int j=0;j<k;j++){
13             cin >> y;
14             map[x][y]=1;
15         }
16     }
17     return ;
18 }
19 int dfs(int x){
20     for (int i=0;i<n;i++){
21         if (map[i][x] && !used[i]){
22             used[i]=1;
23             if (match[i]==-1 || dfs(match[i])){
24                 match[i]=x;
25                 return 1;
26             }
27         }
28     }
29     return 0;
30 }
31 int main(){
32     while (cin >> n && n){
33         init();
34         int ans=0;
35         memset(match,-1,sizeof(match));
36         for (int i=0;i<n;i++){
37             memset(used,0,sizeof(used));
38             if (dfs(i)) ans++;
39         }
40         cout << n-ans/2 << endl;
41     }
42     return 0;
43 }

 

posted @ 2018-03-26 19:05  Changer-qyz  阅读(199)  评论(0编辑  收藏  举报