POJ 1466 Girls and Boys【最大点独立集】
大意:最大点独立集
分析:最大点独立集
代码:
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <vector> 5 using namespace std; 6 7 const int maxn = 505; 8 9 int n; 10 int Link[maxn]; 11 int vis[maxn]; 12 vector<int> G[maxn]; 13 bool Find(int u) { 14 for(int i = 0; i < G[u].size(); i++) { 15 int v = G[u][i]; 16 if(!vis[v]) { 17 vis[v] = 1; 18 if(Link[v] == -1 || Find(Link[v])) { 19 Link[v] = u; 20 return true; 21 } 22 } 23 } 24 return false; 25 } 26 27 int solve() { 28 memset(Link, -1, sizeof(Link)); 29 int ans = 0; 30 for(int i = 0; i < n; i++) { 31 if(G[i].size()) { 32 memset(vis, 0, sizeof(vis)); 33 if(Find(i)) ans ++; 34 } 35 } 36 return ans; 37 } 38 39 int main() { 40 int a, num, b; 41 while(EOF != scanf("%d",&n)) { 42 for(int i = 0; i < n; i++) { 43 G[i].clear(); 44 } 45 for(int i = 0; i < n; i++) { 46 scanf("%d: (%d)", &a, &num); 47 for(int j = 0; j < num; j++) { 48 scanf("%d",&b); 49 G[a].push_back(b); 50 } 51 } 52 printf("%d\n", ( 2 * n - solve() ) / 2 ); 53 } 54 return 0; 55 }