Poj--1466(最大独立集)

2014-11-05 18:38:54

思路:直接建图然后求最大独立集即可,需要注意的是答案需要除以2,以为二分图两个集合:X集合和Y集合是一样的,有对称性,所以最大独立集元素个数也是原来的两倍。

 1 /*************************************************************************
 2     > File Name: 1466.cpp
 3     > Author: Nature
 4     > Mail: 564374850@qq.com
 5     > Created Time: Wed 05 Nov 2014 04:09:29 PM CST
 6 ************************************************************************/
 7 
 8 #include <cstdio>
 9 #include <cstring>
10 #include <cstdlib>
11 #include <cmath>
12 #include <vector>
13 #include <map>
14 #include <set>
15 #include <stack>
16 #include <queue>
17 #include <iostream>
18 #include <algorithm>
19 using namespace std;
20 #define lp (p << 1)
21 #define rp (p << 1|1)
22 #define getmid(l,r) (l + (r - l) / 2)
23 #define MP(a,b) make_pair(a,b)
24 typedef long long ll;
25 const int INF = 1 << 30;
26 const int maxn = 510;
27 
28 int N;
29 int g[maxn][maxn];
30 int first[maxn],next[maxn * maxn],ver[maxn * maxn],ecnt;
31 int used[maxn],mat[maxn];
32 
33 void Init(){
34     memset(g,0,sizeof(g));
35     memset(first,-1,sizeof(first));
36     ecnt = 0;
37 }
38 
39 void Add_edge(int u,int v){
40     next[++ecnt] = first[u];
41     ver[ecnt] = v;
42     first[u] = ecnt;
43 }
44 
45 bool find(int p){
46     for(int i = first[p]; i != -1; i = next[i]){
47         int v = ver[i];
48         if(used[v] == 0){
49             used[v] = 1;
50             if(mat[v] == 0 || find(mat[v])){
51                 mat[v] = p;
52                 return true;
53             }
54         }
55     }
56     return false;
57 }
58 
59 int Hungary(){
60     int ans = 0;
61     memset(mat,0,sizeof(mat));
62     for(int i = 0; i < N; ++i){
63         memset(used,0,sizeof(used));
64         if(find(i)) ++ans;
65     }
66     return ans;
67 }
68 
69 int main(){
70     int a,b,c;
71     while(scanf("%d",&N) != EOF){
72         Init();
73         for(int i = 0; i < N; ++i){
74             scanf("%d: (%d)",&a,&b);
75             while(b--){
76                 scanf("%d",&c);
77                 Add_edge(a,c);
78             }
79         }
80         printf("%d\n",N - Hungary() / 2);
81     }
82     return 0;
83 }

 

posted @ 2014-11-05 18:40  Naturain  阅读(129)  评论(0编辑  收藏  举报