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

本文介绍了一种求解二分图中最大独立集问题的算法实现,通过计算最大匹配数并利用公式得出最大独立集的大小。文章提供了一个完整的C++代码示例,用于帮助读者理解算法的具体实现。

题意:有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 }

 

转载于:https://www.cnblogs.com/changer-qyz/p/8652897.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值