题目链接: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-max_match()); 52 } 53 return 0; 54 }