BZOJ 1827: [Usaco2010 Mar]gather 奶牛大集会 树形DP + 带权重心

Description

Bessie正在计划一年一度的奶牛大集会,来自全国各地的奶牛将来参加这一次集会。当然,她会选择最方便的地点来举办这次集会。每个奶牛居住在 N(1<=N<=100,000) 个农场中的一个,这些农场由N-1条道路连接,并且从任意一个农场都能够到达另外一个农场。道路i连接农场A_i和B_i(1 <= A_i <=N; 1 <= B_i <= N),长度为L_i(1 <= L_i <= 1,000)。集会可以在N个农场中的任意一个举行。另外,每个牛棚中居住者C_i(0 <= C_i <= 1,000)只奶牛。在选择集会的地点的时候,Bessie希望最大化方便的程度(也就是最小化不方便程度)。比如选择第X个农场作为集会地点,它的不方便程度是其它牛棚中每只奶牛去参加集会所走的路程之和,(比如,农场i到达农场X的距离是20,那么总路程就是C_i*20)。帮助Bessie找出最方便的地点来举行大集会。 考虑一个由五个农场组成的国家,分别由长度各异的道路连接起来。在所有农场中,3号和4号没有奶牛居住。

Input

第一行:一个整数N * 第二到N+1行:第i+1行有一个整数C_i * 第N+2行到2*N行,第i+N+1行为3个整数:A_i,B_i和L_i。

Output

* 第一行:一个值,表示最小的不方便值。
题解:不难发现选定点必须是树的带权重心 (任意儿子大小不能超过总和一半). 
直接 DFS 求重心并算一下贡献即可. 
#include <bits/stdc++.h>
#define setIO(s) freopen(s".in","r",stdin) 
#define maxn 1000000 
#define inf 100000000000000 
#define ll long long 
using namespace std; 
ll f[maxn], siz[maxn], sumv[maxn]; 
int C[maxn], hd[maxn], to[maxn << 1], nex[maxn << 1], val[maxn << 1]; 
int n, edges, root; 
ll tot; 
void add(int u, int v, int c)
{nex[++edges] = hd[u], hd[u] = edges, to[edges] = v, val[edges] = c; 
}
void dfs(int u, int ff)
{siz[u] = C[u], f[u] = 0; for(int i = hd[u]; i ; i = nex[i]) {int v = to[i]; if(v == ff) continue; dfs(v, u);         siz[u] += siz[v];f[u] = max(f[u], siz[v]); }               f[u] = max(f[u], tot - siz[u]); if(f[u] < f[root]) root = u; 
}      
void calc(int u,int ff)
{siz[u] = C[u], sumv[u] = 0; for(int i = hd[u]; i ; i = nex[i]){int v = to[i]; if(v == ff) continue; calc(v, u); siz[u] += siz[v]; sumv[u] += sumv[v] + val[i] * siz[v]; }
}
int main()
{// setIO("input"); scanf("%d",&n); for(int i = 1; i <= n; ++i) scanf("%d",&C[i]), tot += C[i]; for(int i = 1, u, v, c; i < n; ++i) {scanf("%d%d%d",&u,&v,&c); add(u, v, c); add(v, u, c); }f[0] = inf, root = 0, dfs(1, 0);memset(siz, 0, sizeof(siz)), calc(root, 0);  printf("%lld\n",sumv[root]); return 0; 
}

  

转载于:https://www.cnblogs.com/guangheli/p/10982700.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/424557.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[运动][组合]睡前运动

保持核心肌群力量 入门级组合运动 全身从上到下 俯卧撑 手部肩部 卷腹 腹部 仰卧抬腿 臀部 深蹲 下肢力量 扶墙踮脚 小腿

第五十二期:Java开发数据库设计的14个技巧,你知道几个?

可以是一对一、一对多、多对多的关系。在一般情况下&#xff0c;它们是一对一的关系&#xff1a;即一张原始单据对应且只对应一个实体。在特殊情况下&#xff0c;它们可能是一对多或多对一的关系&#xff0c;即一张原始单证对应多个实体&#xff0c;或多张原始单证对应一个实体…

算法八——动态规划

1 0-1背包问题 背包能够承受的总重量一定w&#xff0c;每个物品的总量不同int[] weight表示。怎么放才能让背包中物品的总重量最大。 每次决定一种物品&#xff0c;每一层能够达到的状态 state[][] 第0个物品的重量是2&#xff0c;要么装入背包&#xff0c;要么不装入背包&a…

《鸟哥的Linux私房菜--基础篇》学习

第四章 显示日期与时间的指令&#xff1a;date 输入&#xff1a; (base) liyihuadeMacBook-Pro:~ liyihua$ date 输出&#xff1a; Thu Jun 6 08:44:02 CST 2019显示日历指令&#xff1a;cal 输入&#xff1a; (base) liyihuadeMacBook-Pro:~ liyihua$ cal 输出&#xff1a; J…

第五十三期:公司如何选择数据库?DynamoDB、Hadoop和MongoDB 大比拼

随着公司数据存储方式的不断扩展&#xff0c;本文旨在比较公司使用的一些更现代的数据库系统——了解DynamoDB&#xff0c;Hadoop和MongoDB可以提供哪些功能将帮助用户针对业务模型做出更好的决策。 作者&#xff1a;久谦 用户如何选择最能满足当前业务需求的数据库&#xff…

[引用格式][中文论文][毕业论文]毕业论文引用格式 英文引用文献间隔过大

英文引用文献间隔过大&#xff0c;需要选中该条英文引用文献&#xff0c;在段落设置的中文版式设置西文换行&#xff0c;设置后再进行微调 设置前 设置后 设置方法

动态规划——0-1背包问题

文章出处&#xff1a;极客时间《数据结构和算法之美》-作者&#xff1a;王争。该系列文章是本人的学习笔记。 1 0-1背包问题 背包能够承受的总重量一定w&#xff0c;每个物品的总量不同int[] weight表示。怎么放才能让背包中物品的总重量最大。 每次决定一种物品&#xff0c…

003-JavaString数据类型

String类型可以和8中基本数据类型做运算(byte/short/char/int/long/float/double/boolean),且只能是连接运算 1. 区分 连接符 和 “” 的区别 char c a; int num 10; String str "hello"; System.out.println(c str num); //ahello10 System.out.println(str (…

第五十四期:MongoDB与MySQL:如何选择

MongoDB和MySQL分别是领先的开源NoSQL和关系数据库。哪个最适合您的应用程序? 作者&#xff1a;XEyes行走的CODE来源 MongoDB和MySQL分别是领先的开源NoSQL和关系数据库。哪个最适合您的应用程序? 在1990年代的互联网泡沫时期&#xff0c;用于Web应用程序的一种通用软件堆栈…

Centos7下实现多虚拟机互信

假设CentOS 7三台虚拟机A(192.168.111.10)、B(192.168.111.11)、C(192.168.111.12)&#xff0c;需要保证三台虚拟机之间网络的连通性。 操作步骤: 一、在A机上配置 ①以root用户登录&#xff0c;更改ssh配置文件 /etc/ssh/sshd_configRSAAuthentication yes #启用rsa认证Pubkey…

动态规划——矩阵中的最短路径长度

文章出处&#xff1a;极客时间《数据结构和算法之美》-作者&#xff1a;王争。该系列文章是本人的学习笔记。 题目 假设我们有一个 n 乘以 n 的矩阵 w[n][n]。矩阵存储的都是正整数。棋子起始位置在左上角&#xff0c;终止位置在右下角。我们将棋子从左上角移动到右下角。每次…

[密码学基础][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第19篇]Shamir密钥交换场景

这是一系列博客文章中最新的一篇&#xff0c;该文章列举了“每个博士生在做密码学时应该知道的52件事”:一系列问题的汇编是为了让博士生们在第一年结束时知道些什么。 Shamir密钥交换场景是一个被Adi Shamir提出的算法.算法允许多方分割一个密码,例如一个密钥.当足够多的秘密结…

第五十五期:MongoDB数据库误删后的恢复

如果部署的是 MongoDB 复制集&#xff0c;这时还有一线希望&#xff0c;可以通过 oplog 来尽可能的恢复数据;MongoDB 复制集的每一条修改操作都会记录一条 oplog&#xff1b;如果对 MongoDB 做了全量备份 增量备份&#xff0c;那么可以通过备份集及来恢复数据。 作者&#xf…

037-PHP如何返回闭包函数实例

<?php /*: 如何返回闭包函数实例*/# 直接调用将不会输出$txt的内容function demo(){$txt 我爱PHP;$func function () use ($txt) {echo $txt;};# 这里不再直接调用&#xff0c;而且是把实例返回return $func; # 区别于直接写 $func;}# 测试一下 $res demo(); // 函数返…

动态规划——莱文斯坦距离

文章出处&#xff1a;极客时间《数据结构和算法之美》-作者&#xff1a;王争。该系列文章是本人的学习笔记。 莱文斯坦距离 在搜索引擎中会有搜索词纠错的功能。这个功能背后的原理是编辑距离。 编辑距离 编辑距离是量化两个词之间的相似度。 编辑距离是指将一个字符串变为…

[密码学基础][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第18篇]画一个/描述ECB,CBC,CTR模式的操作

操作模式:块密码的安全性依赖于加解密一个固定长度的明文块.当加密或者解密消息的时候,块是被需要的.我们使用一种操作模式将明文的多个块链接在一起.我们会知道,这种链接在一起的方法是十分重要. 电子密码本(ECB)模式:加密,解密. ECB模式是最直接的方法.明文被分割成m块.每一…

动态规划——最长公共子序列长度

最长公共子序列长度是编辑距离的另外一种表示方法。只允许添加、删除字符两种惭怍。它表征的是两字符串之间的相似度。 解决思路是&#xff1a; 如果a[i]b[j]&#xff0c;则 公共子序列长度加1&#xff0c;继续考察a[i1]和b[j1]。 如果a[i]!b[j]&#xff0c;则删除a[i]或者在b[…

【转】store_schema.sql

来源&#xff1a;https://www.cnblogs.com/cenliang/p/5162939.html 这个是《精通Oracle Database 12c SQL & PL/SQL编程(第三版)》的数据&#xff0c;我用的是Oracle11g版本&#xff0c;做了些微调&#xff0c;如日期格式等。 给自己留个存档&#xff0c;以备不时之需~ --…

[密码学基础][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第20篇]Merkle-Damgaard hash函数如何构造

这里讲的是MD变换,MD变换的全称为Merkle-Damgaard变换.我们平时接触的hash函数都是先构造出一个防碰撞的压缩函数.然后先证明这个小的,固定长度的压缩函数是安全的,然后再用它构造一个任意长度的哈希算法.虽然存在很多其它的构造方法,MD是迄今为止最常用的(至少是被用到最多的)…

第五十六期:IPv6只是增加了地址数量?其实真相并没有那么简单!

究竟什么是IPv6?它到底是干啥用的?IPv6的全称是Internet Protocol version 6。其中&#xff0c;Internet Protocol译为“互联网协议”。所以&#xff0c;IPv6就是互联网协议第6版。 作者&#xff1a;小枣君 10月20日&#xff0c;在乌镇举办的第六届世界互联网大会上&#x…