Girls and Boys POJ - 1466(最大独立集)
思路:二分图中,最大独立集 = 顶点数 - 最小点覆盖(最大匹配),这里没有说明明确的二分图,所以匹配出的是二倍的最大匹配(男配女,女配男)。
1 #include <iostream> 2 #include <algorithm> 3 #include <cstdio> 4 #include <vector> 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 }
1