两点问题:
第一个 您的数组开小了; 开4e4就足够了 因为您连得是双向边
第二:您cnt声明的位置不对,太靠下了
AC代码:
```cpp
#include<iostream>
#include<string.h>
using namespace std;
//Á´Ê½Ç°ÏòÐÇ
struct Edge{
int to,next;
};
Edge edge[160100];
int head[160100];
int cnt=0;
void add(int u,int v){//¼Ó±ß
edge[cnt].to=v;
edge[cnt].next=head[u];
head[u]=cnt++;
}
int n;//½Úµã¸öÊý
int nums[160100];//ÿ¸ö½ÚµãµÄȨÖØ
int dp[160100];//dp[i]:´æ·Å iΪ¸ùµÄÁªÍ¨Çø×î´óÖµ
//±ßµÄÌõÊý
bool visit[160100];//±ÜÃâdfsµÄʱºòÖظ´±éÀú£¬Ôì³ÉËÀÑ»·
int ans=-2147483647;
void dfs(int root){//±éÀú
if(head[root]==-1) dp[root]=nums[root];
else{
visit[root]=true;
dp[root]=nums[root];
for(int i=head[root];i!=-1;i=edge[i].next){
if(visit[edge[i].to]==true) continue;
else{
dfs(edge[i].to);
dp[root]+=max(0,dp[edge[i].to]);
}
}
ans=max(ans,dp[root]);
}
}
int main(){
memset(head,-1,sizeof(head));
memset(visit,false,sizeof(visit));
cin>>n;
for(int i=1;i<=n;i++) cin>>nums[i];
int l,k;
for(int i=1;i<n;i++){
cin>>l>>k;
add(l,k);
add(k,l);//Ë«Öؼӱß
}
dfs(1);
cout<<ans;
return 0;
}
```
by LawrenceSivan @ 2021-03-22 15:47:30