啊这题~
WA了#3
Wrong Answer.wrong answer On line 1 column 1, read 6, expected 7.
勒里个嘞
#include<bits/stdc++.h>
using namespace std;
const int N=100005;
long long n,e[N],ne[N],h[N],w[N],idx,d[N],ans;//ans为答案,d是一类路线。
bool f[N];//标记某点是否算过。
void add(long long a,long long b){
e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
void dp(long long y){//计算以点j为树根中最大的连通块。
f[y]=1;//标记该点算过。
for(long long i=h[y];~i;i=ne[i]){//枚举该点的节点。
long long j=e[i];//节点的编号。
if(f[j]) continue;
dp(j); //先计算节点,求较小的。判断用来防止倒着计算。
d[y]=max(d[y],d[y]+d[j]);
ans=max(ans,d[y]);
//cout<<"d["<<y<<"]="<<d[y]<<endl;
}
}
int main(){
cin>>n;
memset(h,-1,sizeof(h));
for(int i=1;i<=n;i++) cin>>w[i],d[i]=w[i];
for(int i=1;i<n;i++){
long long a,b;
cin>>a>>b;
add(a,b),add(b,a);
}
dp(1);// 任取一点开始。
cout<<ans;
return 0;
}