要根据题目描述看出这是一个树,然后在树上搜索......
关于看出这是一个树,茅佳源老师在寒假的时候提醒过两次......
然后注意在树上距离为2的情况有两种,一种是祖先关系,另一种是并列为儿子......
然后就好了
1 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 typedef long long ll; 5 const int mod=10007; 6 const int maxn=2e6+7; 7 ll val[maxn],head[maxn]; 8 ll sum,imax,num,n; 9 struct Edge{ 10 int next,to; 11 }edge[maxn]; 12 void add(int from,int to){ 13 edge[++num].next=head[from]; 14 edge[num].to=to; 15 head[from]=num; 16 } 17 void build(int u,int pre){ 18 ll su=0,ima=0; 19 for(int i=head[u];i;i=edge[i].next){ 20 int v=edge[i].to;if(v==pre) continue; 21 imax=max(imax,val[pre]*val[v]);imax=max(imax,ima*val[v]); 22 sum+=val[pre]*val[v]%mod;sum+=su*val[v]%mod; 23 su+=val[v];ima=max(ima,val[v]); 24 build(v,u); 25 } 26 } 27 int main(){ 28 cin>>n; 29 for(int i=1;i<n;i++){ 30 int u,v;cin>>u>>v; 31 add(u,v);add(v,u); 32 } 33 for(int i=1;i<=n;i++) cin>>val[i]; 34 build(1,0); 35 cout<<imax<<" "<<sum*2%mod<<endl; 36 return 0; 37 }