/ Vijos / 讨论 / 问答 /

大神帮我看一下为什么CE

#include<cstdio>
#include<cstring>
#include<algorithm>
int n,tot=0,first[200001],next[200001],v[200001],sum[200001],w[200001],ans1=0,maxn[200001];
int ans2=0;
bool visit[200001];
using namespace std;
void build(int x,int y){
next[++tot]=first[x];
first[x]=tot;
v[tot]=y;
next[++tot]=first[y];
first[y]=tot;
v[tot]=x;
}
void dfs(int x){
int t=first[x];
visit[x]=true;
while(t!=0){
if(not visit[v[t]]){
sum[x]+=w[v[t]];
sum[v[t]]+=w[x];
maxn[x]=max(maxn[x],w[v[t]]);
dfs(v[t]);
ans1=max(ans1,w[x]*maxn[v[t]]);
}
t=next[t];
}
return;
}
void solve(int x){
int t=first[x];
visit[x]=true;
while(t!=0){
if(not visit[v[t]]){
solve(v[t]);
}
ans2+=(w[v[t]]*(sum[x]-w[v[t]]))%10007;
t=next[t];
}
return;
}
int main(){
scanf("%d",&n);
memset(first,0,sizeof(first));
memset(next,0,sizeof(next));
memset(sum,0,sizeof(sum));
memset(maxn,0,sizeof(maxn));
memset(visit,false,sizeof(visit));
for(int i=1;i<=n-1;i++)
{
int x,y;
scanf("%d%d",&x,&y);
build(x,y);
}
for(int i=1;i<=n;i++)
scanf("%d",&w[i]);
dfs(1);
memset(visit,false,sizeof(visit));
solve(1);
printf("%d %d\n",ans1,ans2);
return 0;
}

3 条评论

  • 1