AcWing 1220. 生命之树
原题链接
中等
作者:
滚滚长江东逝水
,
2021-03-10 16:46:01
,
所有人可见
,
阅读 486
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
typedef long long LL;
LL dp[N];//以当前节点为根节点最大值
vector <int> branch[N];//存储从根节点能延续到哪儿
int value[N];//存储每个节点的值
void dfs(int current,int father){
dp[current]=value[current];//存入根节点值
for(const auto &child:branch[current]){
if(child==father) continue;//避免回头
dfs(child,current);//循着根节点计算
dp[current]+=max(0ll,dp[child]);//看孩子结点的值是否大于0,决定要不要
}
}
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++) cin>>value[i];
int v,w;
for(int i=1;i<n;i++){
cin>>v>>w;
branch[v].push_back(w);
branch[w].push_back(v);//根节点是相对的
}
dfs(1,0);//必定会有第一个节点,所以从第一个节点开始,他此时没有父节点
LL ans=dp[1];
for(int i=1;i<=n;i++) ans=max(ans,dp[i]);
cout<<ans;
}
建议读者顺着代码读