联合权值

要根据题目描述看出这是一个树,然后在树上搜索......

关于看出这是一个树,茅佳源老师在寒假的时候提醒过两次......

然后注意在树上距离为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 } 

 

posted @ 2018-09-01 20:03  lcan  阅读(153)  评论(0编辑  收藏  举报