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