随笔 - 32  文章 - 2  trackbacks - 0
<2008年11月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456

常用链接

留言簿(3)

随笔档案

文章档案

搜索

  •  

积分与排名

  • 积分 - 8798
  • 排名 - 1247

最新评论

阅读排行榜

评论排行榜

要注意数据保证了图是一棵树,树形DP。f[i]表示走到i是否必胜,如果f[j]=true (j是i的孩子) f[i]=false,否则f[i]=true。当f[start]=false时第一个恐怖分子必胜。
 1 #include <iostream>
 2 using namespace std;
 3 int n,m;
 4 int link[1001][30];
 5 bool v[1001];
 6 bool g[1001];
 7 int q[1001],st,en;
 8 bool f[1001];
 9 
10 void bfs(int x){
11     st=0; en=1;
12     q[1]=x;
13     v[x]=true;
14     while (st<en){
15         ++st;
16         int nx=q[st];
17         for (int i=1;i<=link[nx][0];++i) if (!v[link[nx][i]]){
18             ++en;
19             q[en]=link[nx][i];
20             v[link[nx][i]]=true;
21             }
22         }
23     }
24 
25 int main(){
26     scanf("%d %d",&n,&m);
27     for (int i=1;i<n;++i){
28         int a,b;
29         scanf("%d %d",&a,&b);
30         link[a][++link[a][0]]=b;
31         link[b][++link[b][0]]=a;
32         }
33     bfs(m);
34     for (int i=n;i>0;--i){
35         int nx=q[i];
36         g[nx]=true;
37         bool re=true;
38         for (int j=1;j<=link[nx][0];++j) if (g[link[nx][j]]){
39             if (f[link[nx][j]]){
40                 re=false;
41                 break;
42                 }
43             }
44         f[nx]=re;
45         }
46     if (!f[m]){
47         int x;
48         for (int i=1;i<=link[m][0];++i) if (f[link[m][i]]){
49             x=link[m][i];
50             break;
51             }
52         printf("First player wins flying to airport %d",x);
53         }
54     else printf("First player loses");
55     }
56 

posted on 2008-11-06 17:17 Joseph 阅读(194) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理