cogs1804 联合权值 dp

填坑……链接:http://cogs.pro/cogs/problem/problem.php?pid=1804

题意:给出一棵树,定义两个距离为2的点权值乘积为这两个点产生的联合权值,求出整棵树最大联合权值及联合权值之和。

实际上早就做过……现在重做旧题感觉还是很有必要……

我们可以枚举每一个点作为可以产生联合权值的两点的中点,对于这个点来说,他周围的点权值之和就是

\sum\limits_{i=1}^N(\sum\limits_{u,v \in adj_i, u \neq v} W_u \times W_v)

然后对于每一个中点,他做出的贡献也就可以表示成

S_i = \sum_{j \in adj_i} (W_j \times (\sum_{k \in adj_i} W_k) - W_j)

然后大力化简可得

S_i ={ (\sum_{j \in adj_i} W_j)} ^ 2 - \sum_{j \in adj_i} W_j^2

这也就是我们需要的求和式子。

至于最大的嘛……直接找到最大的和次大的相乘比较就可以了……

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cstring>
 5 using namespace std;
 6 const int mod=10007,maxn=200005;
 7 struct node
 8 {
 9     int from,to,next;
10 }edge[maxn<<1];
11 int head[maxn],tot,n,weight[maxn];
12 void addedge(int u,int v)
13 {
14     edge[++tot]=(node){u,v,head[u]};head[u]=tot;
15 }
16 int haha()
17 {
18     freopen("linkb.in","r",stdin);
19     freopen("linkb.out","w",stdout);
20     scanf("%d",&n);
21     for(int i=1;i<n;i++)
22     {
23         int x,y;scanf("%d%d",&x,&y);
24         addedge(x,y);addedge(y,x);
25     }
26     for(int i=1;i<=n;i++)scanf("%d",&weight[i]);
27     int maxx=0;long long sum=0;
28     for(int i=1;i<=n;i++)
29     {
30         int firmax=0,secmax=0;long long sigma=0,pow2sigma=0;
31         for(int j=head[i];j;j=edge[j].next)
32         {
33             int v=edge[j].to;
34             if(weight[v]>firmax)secmax=firmax,firmax=weight[v];
35             else secmax=max(secmax,weight[v]);
36             sigma=(sigma+weight[v]);pow2sigma=(pow2sigma+weight[v]*weight[v])%mod;
37         }
38         maxx=max(maxx,firmax*secmax);
39         sum=(sum+sigma*sigma-pow2sigma)%mod;
40     }
41     printf("%d %lld",maxx,sum);
42 }
43 int sb=haha();
44 int main(){;}

cogs1804

时间: 2024-08-29 08:31:15

cogs1804 联合权值 dp的相关文章

P1351 联合权值(树形dp)

P1351 联合权值 想刷道水题还交了3次.....丢人 (1.没想到有两个点都是儿子的状况 2.到处乱%(大雾)) 先dfs一遍处理出父亲$fa[x]$ 蓝后再一遍dfs,搞搞就出来了. #include<iostream> #include<cstdio> #include<cstring> #define re register using namespace std; const int p=10007; int max(int &a,int &

[noip2014day1-T2]联合权值

无向连通图 G 有 n 个点,n-1 条边.点从 1 到 n 依次编号,编号为 i 的点的权值为 Wi,每条边的长度均为 1.图上两点(u, v)的距离定义为 u 点到 v 点的最短距离.对于图 G 上的点对(u, v),若它们的距离为 2,则它们之间会产生Wu*Wv的联合权值.请问图 G 上所有可产生联合权值的有序点对中,联合权值最大的是多少?所有联合权值之和是多少? 题解:树形dp: #include<iostream> #include<cstring> #include&l

Noip2014模拟赛解题心得【联合权值】

首先说明一下,我是一个刚刚进入oi界不到半年的蒟蒻--半年来,我是仅仅凭着兴趣和决心,在校队的一群dalao中瑟瑟发抖.我做的很多题目都是"苟"出来的,就比如说这次模拟赛中的"联合权值",仅凭暴力只坑了40分. 现在就从这道题目开始分析吧.题目如下: 标题: 联合权值 详情: 输入格式: 第一行包含 1 个整数 n. 接下来 n-1 行,每行包含 2 个用空格隔开的正整数 u.v,表示编号为 u 和编号为 v 的点 之间有边相连. 最后 1 行,包含 n 个正整数,

[NOIP2014]联合权值

描述 无向连通图G有n个点,n-1条边.点从1到n依次编号,编号为i的点的权值为Wi  ,每条边的长度均为1.图上两点(u, v)的距离定义为u点到v点的最短距离.对于图G上的点对(u, v),若它们的距离为2,则它们之间会产生Wu×Wv的联合权值. 请问图G上所有可产生联合权值的有序点对中,联合权值最大的是多少?所有联合权值之和是多少? 输入格式 输入文件名为link.in. 第一行包含1个整数n. 接下来n-1行,每行包含2个用空格隔开的正整数u.v,表示编号为u和编号为v的点之间有边相连.

洛谷 P1351 联合权值(NOIp2014D1T2)

题目描述 无向连通图G 有n 个点,n - 1 条边.点从1 到n 依次编号,编号为 i 的点的权值为W i ,每条边的长度均为1 .图上两点( u , v ) 的距离定义为u 点到v 点的最短距离.对于图G 上的点对( u, v) ,若它们的距离为2 ,则它们之间会产生Wu×Wv 的联合权值. 请问图G 上所有可产生联合权值的有序点对中,联合权值最大的是多少?所有联合权值之和是多少? 输入输出格式 输入格式: 输入文件名为link .in. 第一行包含1 个整数n . 接下来n - 1 行,每

洛谷——P1351 联合权值

https://www.luogu.org/problem/show?pid=1351 题目描述 无向连通图G 有n 个点,n - 1 条边.点从1 到n 依次编号,编号为 i 的点的权值为W i ,每条边的长度均为1 .图上两点( u , v ) 的距离定义为u 点到v 点的最短距离.对于图G 上的点对( u, v) ,若它们的距离为2 ,则它们之间会产生Wu×Wv 的联合权值. 请问图G 上所有可产生联合权值的有序点对中,联合权值最大的是多少?所有联合权值之和是多少? 输入输出格式 输入格式

洛谷【P1351】codevs3728 联合权值

题目描述 无向连通图G 有n 个点,n - 1 条边.点从1 到n 依次编号,编号为 i 的点的权值为W i ,每条边的长度均为1 .图上两点( u , v ) 的距离定义为u 点到v 点的最短距离.对于图G 上的点对( u, v) ,若它们的距离为2 ,则它们之间会产生Wu×Wv 的联合权值. 请问图G 上所有可产生联合权值的有序点对中,联合权值最大的是多少?所有联合权值之和是多少? 输入输出格式 输入格式: 输入文件名为link .in. 第一行包含1 个整数n . 接下来n - 1 行,每

【NOIP之旅】NOIP2014 day1 T2 联合权值

2.联合权值 (link.cpp/c/pas) [问题描述] 无向连通图G有n个点,n-1条边.点从1到n依次编号,编号为i的点的权值为Wi  ,每条边的长度均为1.图上两点(u, v)的距离定义为u点到v点的最短距离.对于图G上的点对(u, v),若它们的距离为2,则它们之间会产生Wu×Wv的联合权值. 请问图G上所有可产生联合权值的有序点对中,联合权值最大的是多少?所有联合权值之和是多少? [输入] 输入文件名为link.in. 第一行包含1个整数n. 接下来n-1行,每行包含2个用空格隔开

洛谷1351 联合权值

题目描述 无向连通图G 有n 个点,n - 1 条边.点从1 到n 依次编号,编号为 i 的点的权值为W i   ,每条边的长度均为1 .图上两点( u ,  v ) 的距离定义为u 点到v 点的最短距离.对于图G 上的点对( u, v) ,若它们的距离为2 ,则它们之间会产生Wu×Wv 的联合权值. 请问图G 上所有可产生联合权值的有序点对中,联合权值最大的是多少?所有联合权值之和是多少? 输入输出格式 输入格式: 输入文件名为link .in. 第一行包含1 个整数n . 接下来n - 1