### 洛谷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. sql server编写脚本求解第1天1分钱之后每天两倍持续一个月的等比数列问题

    一.问题 问题1 场景:如果你未来的丈母娘要求你,第1天给她1分钱,第2天给2分钱,第3天给4分钱,以此类推,每天给前一天的2倍,给1个月(按30天)算就行.问:第30天给多少钱,总共给多少钱? 问题 ...

  2. A:linux基础章节导航

    本章的内容主要有: 模板机的安装 常用的小命令 find awk vim sed

  3. PDF软件

    推荐的PDF阅读软件:文电通

  4. 洛谷 UVA10226 Hardwood Species

    洛谷 UVA10226 Hardwood Species 洛谷评测传送门 题目描述 PDF 输入格式 输出格式 输入输出样例 输入 #1复制 输出 #1复制 题目翻译: 给定若干字符串,输出格式为:( ...

  5. java调用py文件传参执行

    java执行的也是py文件主函数. 传参: String url="*********************"; String[] args1 = new String[] { ...

  6. 一个适合于.NET Core的超轻量级工作流引擎:Workflow-Core

    一.关于Workflow-Core 近期工作上有一个工作流的开发需求,自己基于面向对象和职责链模式捣鼓了一套小框架,后来在github上发现一个轻量级的工作流引擎轮子:Workflow-Core,看完 ...

  7. 【RTOS】基于V7开发板的最新版uCOS-III V3.07.03程序模板,含MDK和IAR,支持uC/Probe,与之前版本变化较大

    模板下载: 链接:https://pan.baidu.com/s/1_4z_Lg51jMT87RrRM6Qs3g   提取码:2gns 对MDK的AC6也做了支持:https://www.cnblog ...

  8. ETCD:gRPC代理

    原文地址:gRPC proxy gRPC代理是在gRPC层(L7)运行的无状态etcd反向代理.代理旨在减少核心etcd群集上的总处理负载.对于水平可伸缩性,它合并了监视和租约API请求. 为了保护集 ...

  9. DataTable实现分组

    有时候我们从数据库中查询出来数据之后,需要按照DataTable的某列进行分组,可以使用下面的方法实现,代码如下: using System; using System.Collections.Gen ...

  10. 【LeetCode】11. 盛最多水的容器

    题目 给定 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) .在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0).找出其中的两 ...