题目链接

题目

题目描述

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.

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.

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.

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\)

输出描述

  • 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

输出

15

题解

知识点:树形dp。

题目给了一个树,树边有边权表示距离,节点有点权表示牛的数量,现在要选一个树上点,使得所有牛到这个点的距离最小。因此,这是一个二次扫描+换根dp的问题,因为是解决每个点对于整棵树的问题。

第一遍dp,先以 \(1\) 为根,得出节点 \(1\) 的答案(当然可选其他点作为根)。设 \(dp[u]\) 为从 \(u\) 开始到以 \(u\) 为根的子树中各个节点牛的总距离。转移方程为:

\[dp[u] = \sum (dp[v] + sz[v] \cdot w)
\]

第二遍dp,从 \(1\) 出发,处理所有节点的答案。设 \(dp'[u]\) 为从 \(u\) 到牛的总距离,则有转移方程:

\[dp'[v] = dp'[u] + (sz[1] - 2 \cdot sz[v])
\]

时间复杂度 \(O(n)\)

空间复杂度 \(O(n)\)

代码

#include <bits/stdc++.h>
#define ll long long using namespace std; int a[100007];
vector<pair<int, int>> g[100007];
ll sz[100007], dp[100007]; void dfs1(int u, int fa) {
sz[u] = a[u];
for (auto [v, w] : g[u]) {
if (v == fa) continue;
dfs1(v, u);
sz[u] += sz[v];
dp[u] += dp[v] + sz[v] * w;
}
} void dfs2(int u, int fa) {
for (auto [v, w] : g[u]) {
if (v == fa) continue;
dp[v] = dp[u] + (sz[1] - 2 * sz[v]) * w;
dfs2(v, u);
}
} int main() {
std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int n;
cin >> n;
for (int i = 1;i <= n;i++) cin >> a[i];
for (int i = 1;i < n;i++) {
int u, v, w;
cin >> u >> v >> w;
g[u].push_back({ v,w });
g[v].push_back({ u,w });
}
dfs1(1, 0);
dfs2(1, 0);
//for (int i = 1;i <= n;i++) cout << dp[i] << ' ';
ll ans = ~(1LL << 63);
for (int i = 1;i <= n;i++) ans = min(ans, dp[i]);
cout << ans << '\n';
return 0;
}

NC24734 [USACO 2010 Mar G]Great Cow Gathering的更多相关文章

  1. BZOJ1827[USACO 2010 Mar Gold 1.Great Cow Gathering]——树形DP

    题目描述 Bessie正在计划一年一度的奶牛大集会,来自全国各地的奶牛将来参加这一次集会.当然,她会选择最方便的地点来举办这次集会.每个奶牛居住在 N(1<=N<=100,000) 个农场 ...

  2. BZOJ1785[USACO 2010 Jan Gold 3.Cow Telephones]——贪心

    题目描述 奶牛们建立了电话网络,这个网络可看作为是一棵无根树连接n(1 n 100,000)个节点,节点编号为1 .. n.每个节点可能是(电话交换机,或者电话机).每条电话线连接两个节点.第i条电话 ...

  3. BZOJ1828[USACO 2010 Mar Gold 2.Barn Allocation]——贪心+线段树

    题目描述 输入 第1行:两个用空格隔开的整数:N和M * 第2行到N+1行:第i+1行表示一个整数C_i * 第N+2到N+M+1行: 第i+N+1行表示2个整数 A_i和B_i 输出 * 第一行: ...

  4. BZOJ1915[USACO 2010 Open Gold 1.Cow Hopscotch]——DP+斜率优化

    题目描述 奶牛们正在回味童年,玩一个类似跳格子的游戏,在这个游戏里,奶牛们在草地上画了一行N个格子,(3 <=N <= 250,000),编号为1..N.就像任何一个好游戏一样,这样的跳格 ...

  5. NC24840 [USACO 2009 Mar S]Look Up

    NC24840 [USACO 2009 Mar S]Look Up 题目 题目描述 Farmer John's N (1 <= N <= 100,000) cows, convenient ...

  6. NC25025 [USACO 2007 Nov G]Sunscreen

    NC25025 [USACO 2007 Nov G]Sunscreen 题目 题目描述 To avoid unsightly burns while tanning, each of the \(C\ ...

  7. NC24325 [USACO 2012 Mar S]Flowerpot

    NC24325 [USACO 2012 Mar S]Flowerpot 题目 题目描述 Farmer John has been having trouble making his plants gr ...

  8. NC24724 [USACO 2010 Feb S]Chocolate Eating

    NC24724 [USACO 2010 Feb S]Chocolate Eating 题目 题目描述 Bessie has received \(N (1 <= N <= 50,000)\ ...

  9. [USACO 2009 Mar S]Look Up_via牛客网

    题目 链接:https://ac.nowcoder.com/acm/contest/28537/N 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言 ...

  10. BZOJ3476 : [Usaco2014 Mar]The Lazy Cow

    旋转坐标系后转化为正方形,$x'=x+y$,$y'=x-y+1000001$,$k'=2k-1$ 两根扫描线从左往右扫 f[i]表示y坐标下边界为i时的价值和 每次加入/删除一个点等价于一段区间加减 ...

随机推荐

  1. maven总结一: 常用命令

    本文为博主原创,未经允许不得转载: maven常用命令: 1. mvn clean  maven清理 2. mvn compile  maven 编译 3. mvn package maven 打包 ...

  2. python3查看文件是否存在,以及读、写与执行的属性

    技术背景 在使用python对系统文件进行操作的项目中,经常需要用到对本地文件的存在和读写进行判断的操作.最常用的比如os.exists函数,可以很方便的判断给定的文件名是否存在于系统中.但是这里我们 ...

  3. 【C】C语言头文件互锁和包含问题

    [来源] https://mp.weixin.qq.com/s/4tPHkwEd5n-xHNHJHtCoBw

  4. 【TouchGFX】使用CubeMX创建touchgfx项目 -- 初始篇

    1.系统构成,黑色块表示组件非必须 2.环境准备 CubeMX:6.0.1 touchgfx:4.15.0 rt-thread:2020-8-14 commit Keil:5.30 board:stm ...

  5. 【rt-thread】SConscript文件添加格式必须是4空格开头

    SConscript文件添加格式必须是4空格开头,TAB或其他数量的空格均错误

  6. [转帖]vdbench - 性能压力测试工具

    <存储工具系列文章>主要介绍存储相关的测试和调试工具,包括不限于dd.fio.vdbench.iozone.iometer.cosbench等性能负载工具,及strace等调试工具. 1. ...

  7. 【转帖】Linux中如何取消ln链接?(linuxln取消)

    https://www.dbs724.com/163754.html Linux系统使用ln命令可以快速创建链接,ln链接是指把文件和目录链接起来,当改变源时可以快速地改变整个目录下的文件和目录.有时 ...

  8. [转帖]nginx 反向代理中proxy_set_header的含义

    https://www.jianshu.com/p/cd813d68ed25 0.1212020.10.23 09:29:53字数 284阅读 9,939 1.proxy_set_header设置的请 ...

  9. Oracle 高版本导出到低版本的测试验证

    今天验证Oracle 由高版本 备份恢复到低版本 与方神沟通(双 还是他) 说可以使用 version的参数..然后搞一下.. expdp system/Test6530@ora12cr2 schem ...

  10. 记录TritonServer部署多模型到多GPU踩坑 | 京东云技术团队

    一.问题是怎么发现的 部署chatglm2和llama2到一个4*V100的GPU机器上遇到问题 config.pbtxt 中设置模型分别在指定gpu上部署实例配置不生效 如以下配置为在gpu0上部署 ...