【题解】Luogu p2986 [USACO10MAR]伟大的奶牛聚集Great Cow Gat 树型dp
题目描述
Bessie is planning the annual Great Cow Gathering for cows all across the country and, of course, she would like to choose the most convenient location for the gathering to take place.
Bessie正在计划一年一度的奶牛大集会,来自全国各地的奶牛将来参加这一次集会。当然,她会选择最方便的地点来举办这次集会。
Each cow lives in one of N (1 <= N <= 100,000) different barns (conveniently numbered 1..N) which are connected by N-1 roads in such a way that it is possible to get from any barn to any other barn via the roads. Road i connects barns A_i and B_i (1 <= A_i <= N; 1 <= B_i <= N) and has length L_i (1 <= L_i <= 1,000). The Great Cow Gathering can be held at any one of these N barns. Moreover, barn i has C_i (0 <= C_i <= 1,000) cows living in it.
每个奶牛居住在 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)只奶牛。
When choosing the barn in which to hold the Cow Gathering, Bessie wishes to maximize the convenience (which is to say minimize the inconvenience) of the chosen location. The inconvenience of choosing barn X for the gathering is the sum of the distances all of the cows need to travel to reach barn X (i.e., if the distance from barn i to barn X is 20, then the travel distance is C_i*20). Help Bessie choose the most convenient location for the Great Cow Gathering.
在选择集会的地点的时候,Bessie希望最大化方便的程度(也就是最小化不方便程度)。比如选择第X个农场作为集会地点,它的不方便程度是其它牛棚中每只奶牛去参加集会所走的路程之和,(比如,农场i到达农场X的距离是20,那么总路程就是C_i*20)。帮助Bessie找出最方便的地点来举行大集会。
Consider a country with five barns with [various capacities] connected by various roads of varying lengths. In this set of barns, neither barn 3 nor barn 4 houses any cows.
1 3 4 5
@—1—@—3—@—3—@[2]
[1] |
2 | @[1] 2 Bessie can hold the Gathering in any of five barns; here is the table of inconveniences calculated for each possible location:
Gather ——- Inconvenience ———
Location B1 B2 B3 B4 B5 Total
1 0 3 0 0 14 17
2 3 0 0 0 16 19
3 1 2 0 0 12 15
4 4 5 0 0 6 15
5 7 8 0 0 0 15
If Bessie holds the gathering in barn 1, then the inconveniences from each barn are:
Barn 1 0 — no travel time there!
Barn 2 3 — total travel distance is 2+1=3 x 1 cow = 3 Barn 3 0 — no cows there!
Barn 4 0 — no cows there!
Barn 5 14 — total travel distance is 3+3+1=7 x 2 cows = 14 So the total inconvenience is 17.
The best possible convenience is 15, achievable at by holding the Gathering at barns 3, 4, or 5.
输入输出格式
输入格式:
Line 1: A single integer: N
Lines 2..N+1: Line i+1 contains a single integer: C_i
Lines N+2..2*N: Line i+N+1 contains three integers: A_i, B_i, and L_i
第一行:一个整数 N 。
第二到 N+1 行:第 i+1 行有一个整数 C_i
第 N+2 行到 2*N 行:第 i+N+1 行为 3 个整数:A_i,B_i 和 L_i。
输出格式:
- Line 1: The minimum inconvenience possible
第一行:一个值,表示最小的不方便值。
输入输出样例
输入样例#1: 复制
5
1
1
0
0
2
1 3 1
2 3 2
3 4 3
4 5 3
输出样例#1: 复制
15
思路
树型dp
同 Luogu p3478 [POI2008]STA-Station (简化版)
- 同样是先算出以1为聚会点时的答案,再通过递推求得其儿子节点的答案,在由其儿子节点的答案推得再下一层的子节点答案…….
① 假设所有的牛以1为聚会点,求出此时的答案
② 当以3为聚会点时,3号节点以及他子树上的节点都需要退回1->3的路径的长度
除了3号节点以及他子树上的节点都需要前进1->3的路径的长度
得到递推式$f[v]=f[u]-q[v]*dis+(sum-q[v])*dis$ 其中q[i]表示节点i上的牛的数量
代码
#include<cmath>
#include<cstdio>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
#define maxn 200100
#define ll long long
#define re register int
using namespace std;
inline ll read(){
int x=0,w=1;
char ch=getchar();
while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
if(ch=='-') w=-1,ch=getchar();
while(ch>='0'&&ch<='9') x=(x<<1)+(x<<3)+ch-48,ch=getchar();
return x*w;
}
ll dis[maxn],c[maxn],q[maxn],f[maxn],sum; //q[]子树上的节点总数
ll Ans=2147483647;
struct data {
ll v,next,w;
}e[maxn]; ll h[maxn],tot=1,n;
inline void Add(ll u,ll v,ll w) {
e[tot].v=v;
e[tot].next=h[u];
e[tot].w=w;
h[u]=tot++;
}
ll DFS(ll u,ll fa) {
ll tot=0;
for(register ll i=h[u];i;i=e[i].next) {
ll v=e[i].v;
if(v!=fa) {
ll s=DFS(v,u);
dis[u]+=dis[v]+e[i].w*s;
tot+=s;
}
}
return q[u]=tot+c[u];
} void dfs(ll u,ll fa) {
for(register ll i=h[u];i;i=e[i].next) {
ll v=e[i].v;
if(v!=fa) {
ll tmp=e[i].w;
f[v]=f[u]-q[v]*tmp+(sum-q[v])*tmp; //f[]表示从1为根节点到v为根节点需要变化的步数
dfs(v,u);
}
}
} int main(){
n=read();
for(register ll i=1;i<=n;++i) c[i]=read();
for(register ll i=1;i<=n;++i) sum+=c[i];
for(register ll i=1;i<n;++i) {
ll u=read(),v=read(),w=read();
Add(u,v,w);
Add(v,u,w);
}
DFS(1,1);
dfs(1,1);
for(register ll i=1;i<=n;++i) Ans=min(Ans,f[i]);
cout<<Ans+dis[1]<<endl;
return 0;
}
【题解】Luogu p2986 [USACO10MAR]伟大的奶牛聚集Great Cow Gat 树型dp的更多相关文章
- LUOGU P2986 [USACO10MAR]伟大的奶牛聚集Great Cow Gat…
传送门 解题思路 首先第一遍dfs预处理出每个点的子树的siz,然后可以处理出放在根节点的答案,然后递推可得其他答案,递推方程 sum[u]=sum[x]-(val[i]*siz[u])+(siz[1 ...
- 洛谷 P2986 [USACO10MAR]伟大的奶牛聚集Great Cow Gat…(树规)
题目描述 Bessie is planning the annual Great Cow Gathering for cows all across the country and, of cours ...
- P2986 [USACO10MAR]伟大的奶牛聚集Great Cow Gat…
题目描述 Bessie is planning the annual Great Cow Gathering for cows all across the country and, of cours ...
- [洛谷P2986][USACO10MAR]伟大的奶牛聚集Great Cow Gat…
题目大意:给你一棵树,每个点有点权,边有边权,求一个点,使得其他所有点到这个点的距离和最短,输出这个距离 题解:树形$DP$,思路清晰,转移显然 卡点:无 C++ Code: #include < ...
- [USACO10MAR]伟大的奶牛聚集Great Cow Gat…【树形dp】By cellur925
题目传送门 首先这道题是在树上进行的,然后求最小的不方便程度,比较符合dp的性质,那么我们就可以搞一搞树形dp. 设计状态:f[i]表示以i作为聚集地的最小不方便程度.那么我们还需要各点间的距离,但是 ...
- [USACO10MAR]伟大的奶牛聚集Great Cow Gat…
题目描述 Bessie is planning the annual Great Cow Gathering for cows all across the country and, of cours ...
- [USACO10MAR]伟大的奶牛聚集Great Cow Gat… ($dfs$,树的遍历)
题目链接 Solution 辣鸡题...因为一个函数名看了我贼久. 思路很简单,可以先随便指定一个根,然后考虑换根的变化. 每一次把根从 \(x\) 换成 \(x\) 的一个子节点 \(y\),记录一 ...
- 洛谷 P2986 [USACO10MAR]伟大的奶牛聚集(树形动规)
题目描述 Bessie is planning the annual Great Cow Gathering for cows all across the country and, of cours ...
- P2986 [USACO10MAR]伟大的奶牛聚集(思维,dp)
题目描述 Bessie is planning the annual Great Cow Gathering for cows all across the country and, of cours ...
随机推荐
- webpack 快速入门 系列 —— 实战一
实战一 准备本篇的环境 虽然可以仅展示核心代码,但笔者认为在一个完整的环境中边看边做,举一反三,效果更佳. 这里的环境其实就是初步认识 webpack一文完整的示例,包含 webpack.devSer ...
- .NET Worker Service 如何优雅退出
上一篇文章中我们了解了 .NET Worker Service 的入门知识[1],今天我们接着介绍一下如何优雅地关闭和退出 Worker Service. Worker 类 从上一篇文章中,我们已经知 ...
- IP子网划分与聚合
一:IP地址: IP地址是由32位2进制数组成,每8位一组.由点分十进制表达. IP地址可以分为五类 A类(1.0.0.0-126.255.255.255),127.0.0.1 为本地回环地址. B类 ...
- OOP第一章总结
经过了三周的OO,尽管过程不太轻松,但是有所得还是值得欣慰的事! (1)程序结构 第一次作业: UML类图如下,第一次作业在结构上并没有太多面向对象的思想,只是简单的分类,一个运行类,两个对象类,预处 ...
- [JavaScript之BOM与DOM]
[JavaScript之BOM与DOM] BOM(Browser Object Model)是指浏览器对象模型,它使 JavaScript 有能力与浏览器进行"对话". DOM ( ...
- JDBC核心技术(获取数据库链接、数据库事务、数据库链接池)
@ 目录 前言 数据的持久化 Java数据存储技术 JDBC介绍 JDBC体系结构 获取数据库链接 Driver接口 加载注册JDBC驱动 获取数据库链接 数据库链接方式(实例) 方式一:代码中显示出 ...
- C#·对于BOM头之完全解决方案
阅文时长 | 0.46分钟 字数统计 | 798.4字符 主要内容 | 1.引言&背景 2.使用C#写入带有/不带有BOM头的文件? 3.对于读取文件时,避免BOM头造成的异常. 4.声明与参 ...
- iUploader 2.0 七牛云上传工具
iUploader 软件介绍: iUploader主要功能将文件上传至七牛云,返回 Markdown 格式的链接到剪贴板 功能介绍: 图片本地压缩 图片右键上传 图片截取上传 图片复制上传 图片拖拽上 ...
- 马哥Linux--elasticsearch
ELK stack: Lucene: 文档:document 包含了一个或多个域的容器 field:value 域: 有很多选项 索引选项,存储选项,域向量使用选项 索引选项用于通过倒排索引来控制文本 ...
- /var/log/syslog日志usb接口
p:~# cat /proc/bus/input/devices |grep usbP: Phys=usb-0000:00:05.1-1/buttonS: Sysfs=/devices/pci0000 ...