1. 程式人生 > >聯合權值

聯合權值

span spa clas 搜索 ios sum ont struct from

技術分享圖片

要根據題目描述看出這是一個樹,然後在樹上搜索......

關於看出這是一個樹,茅佳源老師在寒假的時候提醒過兩次......

然後註意在樹上距離為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 }

聯合權值