http://poj.org/problem?id=1463
DP,树状DP,或二分图匹配
1 #include <iostream> 2 #include <stdio.h> 3 #include <string.h> 4 #include <vector> 5 using namespace std; 6 7 const int N = 1505; 8 9 int pre[N]; 10 bool flag[N]; 11 vector<int> map[N]; 12 int n; 13 14 int find(int x) 15 { 16 int i, k; 17 for(i = 0; i < map[x].size(); i++) 18 { 19 k = map[x][i]; 20 if(!flag[k]) 21 { 22 flag[k] = true; 23 if(pre[k] == -1 || find(pre[k])) 24 { 25 pre[k] = x; 26 return 1; 27 } 28 } 29 } 30 return 0; 31 } 32 33 int main() 34 { 35 int i, j, r, k, num, sum; 36 while(scanf("%d", &n) != EOF) 37 { 38 memset(pre, -1, sizeof(pre)); 39 for(i = 0; i < n; i++) map[i].clear(); 40 for(i = 0; i < n; i++) 41 { 42 scanf("%d:(%d)", &k, &num); 43 for(j = 0; j < num; j++) 44 { 45 scanf("%d", &r); 46 map[k].push_back(r); //用邻接表 47 map[r].push_back(k); //建双向图 48 } 49 } 50 sum = 0; 51 for(i = 0; i < n; i++) 52 { 53 memset(flag, false, sizeof(flag)); 54 sum += find(i); 55 } 56 printf("%d\n", sum/2); 57 } 58 return 0; 59 }