欢迎访问~原文出处——博客园-zhouzhendong

去博客园看该题解


题目传送门 - Vijos1906


题意概括

  有一棵树,每一个节点都有一个权值w[i]。下面说的x,y都是该树中的节点。

  对于点对(x,y),x,y,保证x和y距离为2,那么他们就可以联合,会产生w[x]*w[y]的联合权值。

  注意:点对(x,y)和(y,x)是不同的。

  现在要回答两个问题:

  1. 所有可以联合的点对的最大联合权值。

  2. 对于所有不同的点对(x,y),求联合权值和,答案对10007取模。


题解

  在一棵树上?

  首先看完体面,觉得像一道树形dp题。

  其实就是一道树形dp题。

  

  我们按照dfs的顺序,首先,我们考虑较简单的一部分。

  对于询问2,我可以先计算一半(点对的逆序也算不同)。

  对于节点x,我们分成两种大情况考虑:

  1. 它与它的儿子的儿子的联合权值。

  2. 它的儿子和它的儿子的联合权值。

  首先考虑第一种。

  做法:

    对于每一个节点,设置两个数组:sum[i]和Max[i],分别表示其子节点的权值和与最大权值。

    这两个量是非常好维护的。

    那么如何统计?

    对于每一个节点,把它和它的儿子的儿子联合即可 —— 两次联合,分别对应两种询问,一次与儿子的sum结合,一次与儿子的Max结合。

  然后第二种:

    对于sum,其实很简单,对于当前累加的部分sum[rt](rt为当前节点),直接联合累加即可。

    不解释,自己看代码。

    那么max也差不多。

代码

#include <cstring>
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <vector>
using namespace std;
const int N=+,M=N*,mod=;
vector <int> son[N];
int n,w[N],sum[N],Max[N],ansMax,anssum;
void dfs(int prev,int rt){
sum[rt]=Max[rt]=;
for (int i=;i<son[rt].size();i++)
if (son[rt][i]!=prev){
int v=son[rt][i];
dfs(rt,v);
anssum=(anssum+w[rt]*sum[v])%mod;
ansMax=max(ansMax,w[rt]*Max[v]);
anssum=(anssum+sum[rt]*w[v])%mod;
ansMax=max(ansMax,w[v]*Max[rt]);
sum[rt]=(sum[rt]+w[v])%mod;
Max[rt]=max(Max[rt],w[v]);
}
}
int main(){
scanf("%d",&n);
for (int i=;i<=n;i++)
son[i].clear();
for (int i=,a,b;i<n;i++){
scanf("%d%d",&a,&b);
son[a].push_back(b);
son[b].push_back(a);
}
for (int i=;i<=n;i++)
scanf("%d",&w[i]);
ansMax=anssum=;
dfs(,);
printf("%d %d",ansMax,anssum*%mod);
return ;
}

Vijos1906 联合权值 NOIP2014Day1T2 树形动态规划的更多相关文章

  1. P1351 联合权值(树形dp)

    P1351 联合权值 想刷道水题还交了3次.....丢人 (1.没想到有两个点都是儿子的状况 2.到处乱%(大雾)) 先dfs一遍处理出父亲$fa[x]$ 蓝后再一遍dfs,搞搞就出来了. #incl ...

  2. vijos1906:联合权值

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

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

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

  4. 【树形DP】【P1351】 【NOIP2014D1T2】联合权值

    传送门 Description 无向连通图 \(G\) 有 \(n\) 个点, \(n-1\) 条边.点从 \(1\) 到 \(n\) 依次编号,编号为 \(i\) 的点的权值为 \(W_i\) ,每 ...

  5. [noip2014day1-T2]联合权值

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

  6. NOIP2014提高组 联合权值(距离为2的树形dp)

    联合权值 题目描述 无向连通图 GG 有 nn 个点,n-1n−1 条边.点从 11 到 nn 依次编号,编号为 ii 的点的权值为 W_iWi​,每条边的长度均为 11.图上两点 (u, v)(u, ...

  7. $Noip2014/Luogu1351$ 联合权值 树形

    $Luogu$ $Description$ 给定一棵树,每两个距离为$2$的点之间可以产生"联合权值","联合权值"定义为这两个数的乘积.求最大的联合权值以及所 ...

  8. P1351 联合权值[鬼畜解法]

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

  9. Codevs 3728 联合权值

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

随机推荐

  1. Oracle——存储过程的使用

    为什么使用存储过程? 存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度. 存储过程的定义: 存储过程(Sto ...

  2. DCNN models

    r egion based RNN Fast RCNN Faster RCNN F-RCN Faster RCNN the first five layers is same as the ZF ne ...

  3. POJ1751 Highways【最小生成树】

    题意: 给你N个城市的坐标,城市之间存在公路,但是由于其中一些道路损坏了,需要维修,维修的费用与公路长成正比(公路是直的). 但现有M条公路是完整的,不需要维修,下面有M行,表示不需要维修的道路两端的 ...

  4. 第16月第31天 mongo

    1. 94  brew install  mongodb 95  cd ~ 96  cd Desktop/web/ 97  ls 98  mkdir mongo 99  cd mongo/ 100  ...

  5. python线程,pipe管道通信原理

    Pipe管道: * 管道实例化后会产生两个通道,分别交给两个进程* 通过send和recv来交互数据,这是一个双向的管道,child和parent可以互相收发 from multiprocessing ...

  6. WPF版公司的自动签到程序

    1.外包公司要求早上签到,就写了一个自动打卡程序. 2.一直都想写这个程序,可是一直没有思路,知道有个软件公司找我做自动答题程序,于是自动打卡程序才应运而生.未来可以将自动答题程序开源工大家查看. 3 ...

  7. C#实现图片叠加,图片上嵌入文字,文字生成图片的方法

    /// <summary>     /// 图片叠加     /// </summary>     /// <param name="sender"& ...

  8. 【转】深入浅出JMS(一)--JMS基本概念

    摘要 The Java Message Service (JMS) API is a messaging standard that allows application components bas ...

  9. c# 界面自适应大小

    采用在窗体事件SizeChanged里面代码控制大小和位置,达到自动适应窗体大小,这样做调整起来方便. private void FrmMain_SizeChanged(object sender, ...

  10. mysql当查询某字段结果为空并赋值

    1 代码 1.1 当当前字段为空,查询结果返回“none”,并且统计出现频率 select case when 字段 is null then 'none' else 字段 end as 字段, co ...