pku1463 Strategic game

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 }

 

posted @ 2013-05-23 19:52  Yuan1991  阅读(146)  评论(0编辑  收藏  举报