WA on 2,输入数据后输出为0 0
。。。
然后 DEBUG 了一下发现只便利了 1 号节点,有 dalao 帮忙康康吗/kel
#include<cstdio>
const int M=2e5+5,mod=10007;
int n,ans1,ans2,d[M],f[M],mx[M],smx[M],sum[M],val[M];
struct Edge{
int to;Edge*nx;
}e[M<<1],*h[M],*cnt=e;
inline int max(const int&a,const int&b){
return a>b?a:b;
}
inline int add(const int&a,const int&b){
return a+b>=mod?a+b-mod:a+b;
}
inline int del(const int&a,const int&b){
return a-b<0?a-b+mod:a-b;
}
inline void Add(const int&u,const int&v){
*cnt=(Edge){v,h[u]};h[u]=cnt++;
*cnt=(Edge){u,h[v]};h[v]=cnt++;
}
void DFS1(int u){
for(Edge*E=h[u];E;E=E->nx){
int v=E->to;
if(v==f[u])continue;
++d[f[v]=u];DFS1(v);
sum[u]=add(sum[u],val[v]);
if(val[v]>=mx[u])smx[u]=mx[u],mx[u]=val[v];
else if(val[v]>smx[u])smx[u]=val[v];
}
}
void DFS2(int u){
for(Edge*E=h[u];E;E=E->nx){
int v=E->to;
if(v==f[u])continue;
DFS2(v);
ans1=max(ans1,val[u]*mx[v]%mod);
ans2=add(ans2,val[u]*sum[v]%mod);
}
ans1=max(ans1,val[u]*(val[u]==mx[f[u]]?smx:mx)[f[u]]%mod);
if(f[u]){
if(d[f[u]]==1)ans2=add(ans2,val[u]*del(sum[f[u]],val[u])%mod);
else ans2=add(ans2,val[u]*del(sum[f[u]],val[u])%mod*5004%mod);
}
}
signed main(){
register int i,u,v;
scanf("%d",&n);
for(i=1;i<n;++i){
scanf("%d%d",&u,&v);
Add(u,v);
}
for(i=1;i<=n;++i)scanf("%d",val+i);
DFS1(1);DFS2(1);
printf("%d %d",ans1,add(ans2,ans2));
}