AcWing 1220. 生命之树
原题链接
中等
作者:
Laycz
,
2024-12-25 11:27:43
,
所有人可见
,
阅读 1
#include <iostream>
#include <cstring>
#include <algorithm>
#define int long long
using namespace std;
const int N = 100010,M = 2 * N;
int w[N]; //f[n]表示以n为根节点最大连通块的分数值
int f[N];
int h[N], e[M], ne[M], idx;
void add(int a,int b)
{
e[idx] = b , ne[idx] = h[a] , h[a] = idx ++;
}
void dfs(int u , int fa)
{
for(int i = h[u];~i;i=ne[i])
{
int j = e[i];
if(j == fa)continue;
dfs(j,u);
f[u] = max(f[u],f[u] + f[j]);
}
}
signed main()
{
memset(h, -1, sizeof h);
int n;
scanf("%lld", &n);
for(int i = 1;i <= n;i++)
{
scanf("%lld", &w[i]);
f[i] = w[i];
}
for(int i = 1;i < n;i++)
{
int a , b;
scanf("%lld%lld",&a,&b);
add(a,b) , add(b,a);
}
dfs(1,-1);
int maxn = f[1];
for(int i = 1;i <= n;i++)
{
maxn = max(maxn,f[i]);
}
cout << maxn << endl;
return 0;
}