联合权值

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

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

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

 

转载于:https://www.cnblogs.com/lcan/p/9571418.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值