题目大意
- 知道一棵树,每个点有权重;
- 删掉任意个点,保留以1为根的子树;
- 使得权值和最大。
题目分析
解题思路
参考代码
#include<bits/stdc++.h>
using namespace std;
const int N=20000;
int a[N],las[N],f[N];
int n,ans,len;
struct nod{
int nex,to;
}e[N];
void add(int x,int y){
len++;
e[len].nex=las[x];
e[len].to=y;
las[x]=len;
}
void dfs(int x,int fa){
f[x]=a[x];
for(int i=las[x];i;i=e[i].nex){
int y=e[i].to;
if(y!=fa){
dfs(y,x);
f[x]+=max(0,f[y]);
}
}
ans=max(ans,f[x]);
}
int main(){
cin>>n;
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
int x,y;
for(int i=1;i<n;i++){
scanf("%d %d",&x,&y);
add(x,y);
add(y,x);
}
dfs(1,0);
cout<<ans;
return 0;
}