VIJOS:P1706(舞会)

描述

Arthur公司是一个等级森严的公司,它们有着严格的上司与下属的关系,公司以总裁为最高职位,他有若干个下属,他的下属又有若干个下属,他的下属的下属又有若干个下属……现接近年尾,公司组织团拜活动,活动中有一部分是自由舞会,公司的每个职员都有一个搞笑值,现要你制定一套哪些人上台的方案,使得台上所有演员的搞笑值最大。当然,职员们是不会和他们的顶头上司一起上台的。

格式

输入格式

第一行一个整数N,表示这个公司总共的职员个数。

接下来一行有N个整数,由空格隔开,第i个整数表示职员i的搞笑值Ai(-1327670≤Ai≤1327670)。

接下来N-1行,每行一个1到N的整数,第i个整数表示职员i+1的顶头上司是谁,当然总裁就是职员1。

输出格式

一个整数,表示台上所有职员搞笑值之和的最大值。

输入:

7
1 1 1 1 1 1 1
1
1
5
1
4
4

输出:

5

没有上司的舞会问题

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
const int MAXN=5005;
typedef long long ll;
int n;
int v[MAXN];
vector<int> tree[MAXN];
ll dp[MAXN][2];
void dfs(int u)
{
    dp[u][1]+=v[u];
    for(int i=0;i<tree[u].size();i++)
    {
        int v=tree[u][i];
        dfs(v);
        dp[u][0]+=max(dp[v][1],dp[v][0]);    
        dp[u][1]+=dp[v][0];
    }
}
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>v[i];
    }
    for(int i=2;i<=n;i++)
    {
        int fa;
        cin>>fa;
        tree[fa].push_back(i);
    }
    dfs(1);
    cout<<max(dp[1][0],dp[1][1])<<endl;
    
    return 0;
}

 

posted on 2016-07-04 10:09  vCoders  阅读(247)  评论(0编辑  收藏  举报

导航