题目:
模板题,用于自我复习
AC代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 2e5 + 5;
vector<int>g[N];//邻接关系
int dp[N];//存放,当前节点作为根的所有子树中,收益最大的价值
void dfs(int x, int fa)
{
for (auto& i : g[x])//遍历此节点的所有分支
{
if (i == fa)continue;
//寻找当前节点的子节点
dfs(i, x);
if (dp[i] > 0)如果子树能带来正收益,那就加进去
dp[x] += dp[i];
}
}
int main()
{
std::ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n;
cin >> n;
for (int i = 1; i <= n; i++)
cin >> dp[i];
for (int i = 1; i <= n - 1; i++)
{
int u, v;
cin >> u >> v;
if (u != v)
{
g[u].push_back(v);
g[v].push_back(u);
}
}
dfs(1, 0);//任意一点都可以作为根,dfs(n,0)也可以
cout << *max_element(dp + 1, dp + 1 + n) << '\n';
return 0;
}