### 洛谷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. [C]表达式结合规律和运算符优先级

    表达式结合规律 如果运算符具有相同的优先级(precedence)有些表达式的结合方式是从左往右,有些则是从右往左结合的(例如赋值运算符): 表达式 结合律 组合方式 a/b%c 从左往右 (a/b) ...

  2. nlp英文的数据清洗代码

    1.常用的清洗方式 #coding=utf-8 import jieba import unicodedata import sys,re,collections,nltk from nltk.ste ...

  3. bzoj5093图的价值:多项式,斯特林数(二项式反演)

    Description “简单无向图”是指无重边.无自环的无向图(不一定连通). 一个带标号的图的价值定义为每个点度数的k次方的和. 给定n和k,请计算所有n个点的带标号的简单无向图的价值之和. 因为 ...

  4. 从壹开始 [ 学调试 ]║ 轻松实现 PC端+移动端的本地同步联调

    缘起 哈喽!(瞬间就想到了开场白:亲爱的朋友们,我又回来了

  5. windows7使用vhd虚拟磁盘

    操作系统 : windows7_x64 创建vhd 磁盘管理 --> 操作 --> 创建vhd 挂载vhd 脚本: rem 挂载VHD @echo off (echo select vdi ...

  6. 深入浅出之js闭包知识点梳理(一)

    简单认识闭包   前言:和大多数编程语言一样,js也采用词法作用域,即函数的执行依赖于变量作用域,这个作用域是在函数定义时决定的,而不是函数调用时决定的.函数对象可以通过作用域链关联起来,函数体内部的 ...

  7. Cesium专栏-热力图(附源码下载)

    Cesium Cesium 是一款面向三维地球和地图的,世界级的JavaScript开源产品.它提供了基于JavaScript语言的开发包,方便用户快速搭建一款零插件的虚拟地球Web应用,并在性能,精 ...

  8. Linux-3.14.12内存管理笔记【伙伴管理算法(1)】

    前面分析了memblock算法.内核页表的建立.内存管理框架的构建,这些都是x86处理的setup_arch()函数里面初始化的,因地制宜,具有明显处理器的特征.而start_kernel()接下来的 ...

  9. property用法,使Python中的get方法和set方法使用更简单

    方法一: class a: def __init__(self): self.__num = 1              #定义一个私有变量(以双下划线开头的是私有变量) def getNum(se ...

  10. The 2019 Asia Nanchang First Round Online Programming Contest

    传送门 A. Enju With math problem 题意: 给出\(a_1,\cdots,a_{100}\),满足\(a_i\leq 1.5*10^8\). 现在问是否存在一个\(pos\), ...