Girls and Boys POJ - 1466(最大独立集)

Girls and Boys

思路:二分图中,最大独立集 = 顶点数 - 最小点覆盖(最大匹配),这里没有说明明确的二分图,所以匹配出的是二倍的最大匹配(男配女,女配男)。

 1 #include 
 2 #include 
 3 #include 
 4 #include 
 5 
 6 using namespace std;
 7 
 8 const int N = 510;
 9 int pre[N];
10 vector<int > E[N];
11 bool vis[N];
12 int n;
13 
14 bool find(int u){
15 
16     for(int i = 0; i < (int)E[u].size(); ++i){
17         int v = E[u][i];
18         if(vis[v]) continue;
19         vis[v] = 1;
20         if(!pre[v] || find(pre[v])){  
21             pre[v] = u;
22             return true;
23         }
24     }
25     return false;
26 }
27 
28 void init(){
29     for(int i = 0; i < n; ++i){
30         pre[i] = 0;
31         E[i].clear();
32     }
33 }
34 
35 void solve(){
36 
37     while(~scanf("%d", &n)){
38         
39         init();
40 
41         int u, x, v;
42         for(int i = 0; i < n; ++i){
43             scanf("%d: (%d)", &u, &x);
44             for(int j = 0; j < x; ++j){
45                 scanf("%d", &v);
46                 E[u].push_back(v);
47             }
48         }
49 
50         int match = 0;
51         for(int i = 0; i < n; ++i){
52             for(int o = 0; o < n; ++o) vis[o] = 0;
53             if(find(i)) match++;
54         }
55 
56         printf("%d\n", n - match / 2);
57         //printf("ans = %d\n", n - match / 2);
58     }
59 }
60 
61 
62 int main(){
63 
64     solve();
65 
66     return 0;
67 }

 

你可能感兴趣的:(Girls and Boys POJ - 1466(最大独立集))