### 洛谷P1351 题目链接 ###

题目大意:

给你 n 个节点, n-1 条边的无向联通图。若定义(u,v)表示 u 与 v 点的最短距离,如果 (u,v)值为 2 ,则这两个点的点权之积(即 W* Wv)称为联合权值,求全图中联合权值的最大值以及联合权值的总和。

分析:

1、由于是 n-1 条边且为无向联通图,很容易判断出该图是个无根树。

2、那我们可以遍历全图中所有节点,然后这些节点的儿子节点的相对距离都是 2 。

3、若 A 节点的两个儿子 a b,他们对答案做贡献的话,那么不可能会有第二个节点也拥有 a b 两个节点作为儿子。所以这样枚举是不会重复的。

4、按理来说,我们需要遍历这个节点的所有儿子节点对,然后依次求和答案。但通过分析可以发现: 若有 a b 两个儿子,那么贡献为 2*ab == (a + b)2 - (a2 + b2);同样若有 3 个儿子 a b c ,则贡献为 2*ab + 2*ac + 2*bc == (a+b+c)2 - (a2 + b2 + c2)。 故可以依次统计 和与平方和 ,然后最后处理一下即可。

5、对于判断最大值: A 节点的儿子节点中最大的两个点权之积,即是 A 为父亲节点时的最大联合权值。那么只要取最大父亲节点的最大联合权值即可。

代码如下: 

#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
#define maxn 200008
typedef long long ll;
const ll mod = ;
int n,cnt;
int head[maxn],in[maxn];
ll a[maxn];
struct Edge{
int to;
int next;
}edge[maxn<<];
inline void add(int u,int v){
edge[++cnt].to=v;
edge[cnt].next=head[u];
head[u]=cnt;
return;
}
int main(){
scanf("%d",&n);
int A,B;
for (int i=; i <= n-; i++) {
scanf("%d%d",&A,&B);
add(A,B),add(B,A);
in[A]++,in[B]++;
}
for (int i=; i <= n; i++) scanf("%lld",&a[i]);
ll ans=,res=;
for (int i=; i <= n; i++) {
if(in[i]<=) continue;
ll s1=,s2=;
ll MMax=,mmax=;
for(int j=head[i];j;j=edge[j].next){
int v=edge[j].to;
s1=(s1+a[v])%mod,s2=(s2+a[v]*a[v]%mod)%mod;
if(a[v]>=MMax){mmax=MMax;MMax=a[v];}
else if(a[v]>mmax) mmax=a[v];
}
ll k = ((s1*s1)%mod-s2+mod)%mod;
ans=(ans+k)%mod;
res=max(res,MMax*mmax);
}
printf("%lld %lld\n",res,ans);
}

洛谷 P1351 (枚举)的更多相关文章

  1. 【题解】洛谷P1351 [NOIP2014TG] 联合权值(树形结构+DFS)

    题目来源:洛谷P1351 思路 由题意可得图为一棵树 在一棵树上距离为2的两个点有两种情况 当前点与其爷爷 当前点的两个儿子 当情况为当前点与其爷爷时比较好操作 只需要在传递时不仅传递父亲 还传递爷爷 ...

  2. 洛谷 P1351 联合权值 题解

    P1351 联合权值 题目描述 无向连通图 \(G\) 有 \(n\) 个点,\(n-1\) 条边.点从 \(1\) 到 \(n\) 依次编号,编号为 \(i\) 的点的权值为 \(W_i\)​,每条 ...

  3. 【洛谷P1351】联合权值

    我们枚举中间点,当连的点数不小于2时进行处理 最大值好搞 求和:设中间点 i 所连所有点权之和为sum 则对于每个中间点i的联合权值之和为: w[j]*(sum-w[j])之和 #include< ...

  4. 【洛谷P1351】[NOIP2014]联合权值

    联合权值 题目链接 首先,直接两重循环暴力枚举得了70分 然后发现第二重循环可以记忆化一下 记忆一下每个点的子节点的权值和.最大值. 次大值(为了处理该点的父节点权值恰好为最大值) 具体看代码 #in ...

  5. 洛谷 P1351 联合权值 —— 树形DP

    题目:https://www.luogu.org/problemnew/show/P1351 树形DP,别忘了子树之间的情况(拐一下距离为2). 代码如下: #include<iostream& ...

  6. 洛谷——P1351 联合权值

    https://www.luogu.org/problem/show?pid=1351 题目描述 无向连通图G 有n 个点,n - 1 条边.点从1 到n 依次编号,编号为 i 的点的权值为W i , ...

  7. [NOIP2014] 提高组 洛谷P1351 联合权值

    题目描述 无向连通图G 有n 个点,n - 1 条边.点从1 到n 依次编号,编号为 i 的点的权值为W i ,每条边的长度均为1 .图上两点( u , v ) 的距离定义为u 点到v 点的最短距离. ...

  8. 洛谷P1351 联合权值(树形dp)

    题意 题目链接 Sol 一道很简单的树形dp,然而被我写的这么长 分别记录下距离为\(1/2\)的点数,权值和,最大值.以及相邻儿子之间的贡献. 树形dp一波.. #include<bits/s ...

  9. 【前缀和】【前缀MAX】洛谷 P1351 NOIP2014提高组 day1 T2 联合权值

    不难发现,树中与某个点距离为2的点只可能是它的父亲的父亲.儿子的儿子 或者 兄弟,分类讨论一下即可. 只有对于兄弟我们不能暴力搞,维护一下每个节点的所有儿子的前缀和.前缀MAX就行了. #includ ...

随机推荐

  1. 小程序之--动态设置页面标题 wx.setNavigationBarTitle

    参考地址 http://www.yilingsj.com/xwzj/2018-11-26/weixin-navigationbartitletext.html 页面最初是[在线教研] 可以在这个页面的 ...

  2. [译]Vulkan教程(18)命令buffers

    [译]Vulkan教程(18)命令buffers Command buffers 命令buffer Commands in Vulkan, like drawing operations and me ...

  3. opencv-python图像二值化函数cv2.threshold函数详解及参数cv2.THRESH_OTSU使用

    cv2.threshold()函数的作用是将一幅灰度图二值化,基本用法如下: #ret:暂时就认为是设定的thresh阈值,mask:二值化的图像 ret,mask = cv2.threshold(i ...

  4. Python 十大装 X 语法(一)

    Python 是一种代表简单思想的语言,其语法相对简单,很容易上手.不过,如果就此小视 Python 语法的精妙和深邃,那就大错特错了.本文精心筛选了最能展现 Python 语法之精妙的十个知识点,并 ...

  5. 保护模式中的PDE与PTE

    Windows内核分析索引目录:https://www.cnblogs.com/onetrainee/p/11675224.html 保护模式中的PDE与PTE 1. PDE与PTE的认知 我们在上一 ...

  6. 数据显示按规格向datatable中增加空白记录

    /// <summary> /// 按前台分页样式为datatable增加空行 /// </summary> /// <param name="gridPage ...

  7. 使用 Polly 实现复杂策略(超时重试)

    一.背景 第一次接触 Polly 还是在做某个微服务系统的时候,那时只会使用单一的超时策略与重试策略,更加高级的特性就没有再进行学习了.最近开为某个客户开发 PC 端的上位机的时候,客户有个需求,在发 ...

  8. javaWeb技术第二篇之CSS、事件和案例

    <!--内联式 CSS (层叠样式表) 编辑 层叠样式表(英文全称:Cascading Style Sheets) CSS不仅可以静态地修饰网页,还可以配合各种脚本语言动态地对网页各元素进行格式 ...

  9. 甲方安全之安卓App第三方加固对比

    前段时间公司要给 Android 应用进行加固,由笔者来选一家加固产品.然后发现,加固产品何其之多,且鱼龙混杂.各种问题也是层出不穷,比如,有些加固时间非常久.有些加固会失败.有些运行会崩溃等等问题. ...

  10. https连接

        在发送连接之前设置显示握手过程:   System.setProperty("javax.net.debug", "all"); DubboServer ...