【题解】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 ...
随机推荐
- python-文件操作练习-配置文件读取、修改、删除
文件操作练习:http://www.cnblogs.com/wupeiqi/articles/4950799.html global log 127.0.0.1 local2 daemon maxco ...
- FreeBSD系统基本操作
1:系统安装 2:关机与重启命令 立即关机,但是不关闭电源: shutdown -h now 立即关机,并且关闭电源: shutdown -p now 重启命令 shutdown -r now
- 【原创】简单解释一下,什么叫TLAB
[Deerhang] TLAB是全程Thread Local Allocation Buffer,中文大致的含义是:线程私有内存分配区.它存在的意义是提高线程在JVM堆上创建对象的效率.那么它是如何做 ...
- JavaScrip条件表达式优化
目录 1,前言 2,多条件if语句优化 3,参数默认值 4,Switch语句优化 1,前言 今早看了一篇文章<JavaScrip实现:如何写出漂亮的条件表达式>,原创于:华为云开发者社区, ...
- Ubuntu执行命令时,不sudo提示权限不足,sudo提示找不到该命令
问题:Ubuntu执行命令时,不sudo提示权限不足,sudo提示找不到该命令 补充描述:尝试将命令所在路径添加到/etc/profile中(所有用户环境变量),结果sudo -i切换到root用户后 ...
- 使用ldap客户端创建zimbra ldap用户的格式
cat << EOF | ldapadd -x -W -H ldap://:389 -D "uid=zimbra,cn=admins,cn=zimbra" dn: ui ...
- 登录框-element-ui 样式调节
element-ui样式调节 首先设置布局 如果想要实现如下效果 需要两行,然后设置偏移,第一行中间只是站位,没有内容,可以考虑使用div占位,设置最小高度 el-card调整圆角 border-ra ...
- [bug] flink on yarn 启动失败
参考 https://www.cnblogs.com/huangguoming/p/11732663.html
- 第3期:Too many open files以及ulimit的探讨
第3期:Too many open files以及ulimit的探讨 毛帅 Java.AI.互联网.金融 10 人赞同了该文章 Too many open files是Java常见的异常,通常是由于系 ...
- Linux如何设置用户登录超时(闲置时间)vi /etc/profile ... export TMOUT=900
Linux如何设置用户登录超时(闲置时间) 转载莫负寒夏ai 最后发布于2019-08-08 15:04:22 阅读数 1897 收藏 展开 1. 针对所有用户 # vi /etc/profile ...