HDU 1520 Anniversary party

题目意思:有n个人,他们的关系是一棵树,每个人有一个欢乐度,举行一个聚会,邀请个人里的一些人,但是如果两个人的关系是上下级,他们最多一个被邀请

int dp[][2]     dp[][0]表示不邀请这个人得到的最大欢乐度,dp[][1]表示邀请这个人得到的最大欢乐度

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<string>
 5 #include<set>
 6 #include<vector>
 7 #include<map>
 8 #include<algorithm>
 9 #include<cmath>
10 #include<stdlib.h>
11 using namespace std;
12 int dp[6200][2];
13 vector<int >ko[6200];
14 int n,pe[6200],fa[6200],ben,vit[6200][2];
15 int dfs(int pos,int way)
16 {
17     if(ko[pos].size()==0)
18     {
19         if(way)
20         dp[pos][way]=pe[pos];
21         else
22         dp[pos][way]=0;
23         return dp[pos][way];
24     }
25     if(vit[pos][way])
26     return dp[pos][way];
27     if(way)
28     dp[pos][way]+=pe[pos];
29     for(int i=0;i<ko[pos].size();i++)
30     {
31         int to=ko[pos][i];
32         if(way==0)
33         {
34             dp[to][0]=dfs(to,0);
35             dp[to][1]=dfs(to,1);
36             vit[to][0]=vit[to][1]=vit[pos][0]=1;
37             dp[pos][0]+=max(dp[to][0],dp[to][1]);
38         }
39         else
40         {
41             dp[to][0]=dfs(to,0);;
42             vit[to][0]=vit[pos][1]=1;
43             dp[pos][1]+=dp[to][0];
44         }
45     }
46     return dp[pos][way];
47 }
48 void solve()
49 {
50     memset(dp,0,sizeof(dp));
51     memset(vit,0,sizeof(vit));
52     dp[ben][0]=dfs(ben,0);
53     dp[ben][1]=dfs(ben,1);
54     cout<<max(dp[ben][0],dp[ben][1])<<endl;
55 }
56 int main()
57 {
58    while(cin>>n)
59    {
60        for(int i=1;i<=n;i++)
61        scanf("%d",&pe[i]);
62        for(int i=1;i<=n;i++)
63        ko[i].clear();
64        int a,b;
65        memset(fa,-1,sizeof(fa));
66        while(scanf("%d%d",&a,&b)&&(a+b)!=0){
67         ko[b].push_back(a);
68         fa[a]=b;
69        }
70         for(int i=1;i<=n;i++)
71         if(fa[i]==-1)
72         ben=i;
73        solve();
74    }
75 }

posted on 2014-07-19 15:03  天凉了  阅读(130)  评论(0编辑  收藏  举报

导航