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

常用链接

留言簿(3)

随笔档案

文章档案

搜索

  •  

积分与排名

  • 积分 - 8793
  • 排名 - 1247

最新评论

阅读排行榜

评论排行榜

树形DP,用数组邻接表空间不够,于是将树转化为二叉树AC
 1 #include <iostream>
 2 using namespace std;
 3 const int maxn=6011;
 4 int n;
 5 int happy[maxn];
 6 int link[maxn][2];
 7 int q[maxn],st,en;
 8 int f[maxn],g[maxn];
 9 bool le[maxn];
10 void bfs(int x){
11     q[++en]=x;
12     while (st<en){
13         ++st;
14         int nx=q[st];
15         int ns=link[nx][0];
16         while (ns!=0){
17             ++en;
18             q[en]=ns;
19             ns=link[ns][1];
20             }
21         }
22     }
23     
24 int max(int a,int b){
25     return a>b?a:b;
26     }
27     
28 void work(int x){
29     f[x]=happy[x];
30     g[x]=0;
31     int ns=link[x][0];
32     while (ns!=0){
33         f[x]+=g[ns];
34         g[x]+=max(g[ns],f[ns]);
35         ns=link[ns][1];
36         }
37     }
38     
39 void init(int a,int b){
40     if (link[a][0]==0) link[a][0]=b;
41     else{
42         int ns=link[a][0];
43         while (link[ns][1]!=0) ns=link[ns][1];
44         link[ns][1]=b;
45         }
46     }
47     
48 int main(){
49     scanf("%d",&n);
50     for (int i=1;i<=n;++i) scanf("%d",&happy[i]);
51     int a,b;
52     scanf("%d %d",&a,&b);
53     while (a!=0){
54         init(b,a);
55         le[a]=true;
56         scanf("%d %d",&a,&b);
57         }
58     for (int i=1;i<=n;++i) if (!le[i]) bfs(i);
59     for (int i=n;i>0;--i) work(q[i]);
60     int ans=0;
61     for (int i=1;i<=n;++i) if (!le[i]) ans+=max(f[i],g[i]);
62     cout<<ans;
63     }
64 

posted on 2008-11-05 20:34 Joseph 阅读(138) 评论(0)  编辑 收藏 引用

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