题目描述
Ural
大学有\red{N}N名职员,编号为\red{1}1~
\red{N}N。
他们的关系就像一棵以校长为根的树,父节点就是子节点的直接上司。
每个职员有一个快乐指数,用整数 \red{H_i}Hi 给出,其中 \red{1≤i≤N}1≤i≤N。
现在要召开一场周年庆宴会,不过,没有职员愿意和直接上司一起参会。
在满足这个条件的前提下,主办方希望邀请一部分职员参会,使得所有参会职员的快乐指数总和最大,求这个最大值。
输入格式
第一行一个整数\red{N}N。
接下来\red{N}N行,第 \red{i}i 行表示 \red{i}i 号职员的快乐指数\red{H _i}Hi 。
接下来\red{N-1}N−1行,每行输入一对整数\red{L, K}L,K,表示\red{K}K是\red{L}L的直接上司。
输出格式
输出最大的快乐指数。
样例
输入样例
7
1
1
1
1
1
1
1
1 3
2 3
6 4
7 4
4 5
3 5
Copy
输出样例
5
老样子,看代码:
/*****************************************
备注:
******************************************/
#include <queue>
#include <math.h>
#include <stack>
#include <stdio.h>
#include <iostream>
#include <vector>
#include <iomanip>
#include <string.h>
#include <algorithm>
using namespace std;
#define LL long long
const int N = 1e5 + 10;
const int INF = 0x3f3f3f3f;
int w[N];
int head[N],to[N],ne[N],id;
int f[N];
int dp[N][2];
void add(int x,int y)
{
++id,to[id] = y,ne[id] = head[x],head[x] = id;
}
void dfs(int u,int s)
{
if(dp[u][s])
return;
for(int i = head[u] ; i ; i = ne[i])
{
int v = to[i];
if(s == 0)
{
dfs(v,s);
dfs(v,!s);
dp[u][s] += max(dp[v][s],dp[v][!s]);
}
else if(s == 1)
{
dfs(v,!s);
dp[u][s] += dp[v][!s];
}
}
if(s == 1)
dp[u][s] += w[u];
}
int main()
{
int n;
cin >> n;
for(int i = 1 ; i <= n ; i++)
cin >> w[i];
for(int i = 1,x,y ; i < n ; i++)
{
cin >> x >> y;
add(y,x);
f[x] = 1;
}
int lz = -1;
for(int i = 1 ; i <= n ; i++)
if(!f[i])
lz = i;
dfs(lz,0);
dfs(lz,1);
cout << max(dp[lz][1],dp[lz][0]) << endl;
return 0;
}