0
点赞
收藏
分享

微信扫一扫

没有上司的舞会

kiliwalk 2022-05-01 阅读 64
c++

题目描述

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;
}

 

举报

相关推荐

0 条评论