题面

题目描述

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.

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找出最方便的地点来举行大集会。

输入格式:

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

输出样例#1:

15

题解

考虑如果依次枚举每一个点作为集会的地点
使用DFS进行计算
然后再依次比较
时间复杂度O(n^2)
但是n的范围太大,显然会超时。

那么,我们应当如何优化?
先看看样例

通过一次O(n)的计算,很容易得出来
如果选择1号节点,答案就是17
既然O(n^2)的计算无法在时间内求解
那么是否可以递推出来呢?
显然是可以的。
观察如果已经知道1号节点所需的时间
那么,我们可以做如下假设:
① 所有的牛首先到达了1号节点
② 3号节点以及他子树上的节点都需要退回1->3的路径的长度
③ 除了3号节点以及他子树上的节点都需要前进1->3的路径的长度

通过上面的三条东西,我们就可以从任意一个父节点推出子节点的时间

所以,又是一遍O(n)的计算就可以推出最终的答案

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
#define MAX 200100
#define ll long long
inline ll read()
{register ll x=0,t=1;register char ch=getchar();while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();if(ch=='-'){t=-1;ch=getchar();}while(ch<='9'&&ch>='0'){x=x*10+ch-48;ch=getchar();}return x*t;
}ll dis[MAX],C[MAX],Q[MAX],f[MAX],Sum,Ans=1000000000000000000;struct Line
{ll v,next,w;
}e[MAX];ll h[MAX],cnt=1,N;inline void Add(ll u,ll v,ll w)
{e[cnt]=(Line){v,h[u],w};h[u]=cnt++;
}
//使用两遍DFS
//第一遍以任意点为根节点计算一遍
//dis[i]表示以i为根的子树到根的距离之和
ll DFS(ll u,ll ff)
{ll tot=0;for(ll i=h[u];i;i=e[i].next){ll v=e[i].v;if(v!=ff){ll s=DFS(v,u);//子树上牛的数量 dis[u]+=dis[v]+e[i].w*s;//统计 tot+=s;//牛的个数}}return Q[u]=tot+C[u];
}
//第二遍计算偏移后的值
//先可以假设走到当前节点的父节点
//再让当前自己点所有牛退回来,父节点的所有牛走过去即可
void DFS2(ll u,ll ff)
{for(ll i=h[u];i;i=e[i].next){ll v=e[i].v;if(v!=ff){ll ss=e[i].w;f[v]=f[u]-Q[v]*ss+(Sum-Q[v])*ss;DFS2(v,u);}}
}int main()
{N=read();for(ll i=1;i<=N;++i)C[i]=read();for(ll i=1;i<=N;++i)Sum+=C[i];//统计牛的总数 for(ll i=1;i<N;++i){ll u=read(),v=read(),w=read();Add(u,v,w);Add(v,u,w);}DFS(1,1);//求出以1为聚集处的结果 DFS2(1,1);//求出其他的偏移值for(ll i=1;i<=N;++i)Ans=min(Ans,f[i]);cout<<Ans+dis[1]<<endl;return 0;
}

转载于:https://www.cnblogs.com/cjyyb/p/7215377.html

【洛谷2986】【USACO10MAR】伟大的奶牛聚集相关推荐

  1. 洛谷P1937 [USACO10MAR]仓配置Barn Allocation

    题目描述 Farmer John recently opened up a new barn and is now accepting stall allocation requests from t ...

  2. [USACO10MAR]伟大的奶牛聚集

    题目描述 Bessie is planning the annual Great Cow Gathering for cows all across the country and, of cours ...

  3. 洛谷----P6183 [USACO10MAR] The Rock Game S

    题目描述 在奶牛回家休息和娱乐之前,Farmer John 希望它们通过玩游戏获得一些智力上的刺激.游戏板由 n 个相同的孔组成,这些孔最初都是空的.一头母牛要么用石头盖住一个洞,要么揭开一个先前被盖 ...

  4. 洛谷·bzoj·伟大的奶牛聚集Great Cow Gather

    初见安~~这里是传送门:洛谷P2986 & bzoj P1827 题目描述 Bessie is planning the annual Great Cow Gathering for cows ...

  5. [洛谷P2124] 奶牛美容

    洛谷题目链接:奶牛美容 题目描述 输入输出格式 输入格式: 输出格式: 输入输出样例 输入样例#1: 6 16 ................ ..XXXX....XXX... ...XXXX... ...

  6. 洛谷1345 [Usaco5.4]奶牛的电信

    题目描述 农夫约翰的奶牛们喜欢通过电邮保持联系,于是她们建立了一个奶牛电脑网络,以便互相交流.这些机器用如下的方式发送电邮:如果存在一个由c台电脑组成的序列a1,a2,...,a(c),且a1与a2相 ...

  7. 洛谷P1868 饥饿的奶牛 题解

    洛谷P1868 饥饿的奶牛 题解 题目链接:P1868 饥饿的奶牛 题意: 有一条奶牛冲出了围栏,来到了一处圣地(对于奶牛来说),上面用牛语写着一段文字. 现用汉语翻译为: 有 NNN 个区间,每个区 ...

  8. BZOJ1232 安慰奶牛cheer (洛谷2916)

    标签:并查集,最小生成树 tips:bzoj这题为权限题,可以去洛谷2916提交 Description Farmer John变得非常懒,他不想再继续维护供奶牛之间供通行的道路.道路被用来连接N ( ...

  9. 奶牛的耳语c语言,洛谷P1296 奶牛的耳语

    题目描述 在你的养牛场,所有的奶牛都养在一排呈直线的牛栏中.一共有 n 头奶牛,其中第 i 头牛在直线上所处的位置可以用一个整数坐标 pi​(0≤pi​≤10^8) 来表示.在无聊的日子里,奶牛们常常 ...

最新文章

  1. 微软副总裁Bob Muglia对Silverlight的公开道歉信
  2. hdu1025 Constructing Roads In JGShining#39;s Kingdom(二分+dp)
  3. 学习《Flask Web开发:基于Python的Web应用开发实战》分享
  4. 安卓隐藏摄像_侧置摄像与隐藏前摄,拒绝单调乏味,这两款国产5G手机独具匠心...
  5. MFC 学习笔记(一):MFC单文档程序运行流程梳理与总结
  6. linux系统学习第一天
  7. LEADTOOLS Multimedia SDK更新:改进RTSP和H.265/H.264的硬件加速
  8. 7.3.8.1 - 并发多线程 死锁和递归锁 - 信号量
  9. win8锁定计算机,Win8怎么关闭锁屏功能
  10. 互联网基础运维分工、职责和技能要求
  11. matlab sparse()
  12. android源码 分享1
  13. idea uml图各符号含义_设计模式-UML类图的各符号含义(转)
  14. 《Redis设计与实现》知识点目录
  15. 计算机学科 集体备课记录,信息技术学科组集体备课活动记录.pdf
  16. 面试官:说说什么是 Java 内存模型(JMM)?
  17. 基于openmv的汽车内后视镜
  18. 微信从原版到现在所有界面图片_微信进入界面的图片有什么含义
  19. 自研数据分析工具——yandas系列二:分析泰坦尼克号沉船事件中的乘客信息表
  20. 图像分割之基于阙值的分割方法

热门文章

  1. VC程序员常用工具篇
  2. Mac OS 如何更改文件的默认打开方式
  3. struct sockaddr_nl 结构体 由来、含义以及使用——获取Linux路由表
  4. 屏蔽基于对话框的MFC程序中按下ESC关闭窗口的功能
  5. React开发(268):debounce is not a function报错
  6. Taro+react开发(38)注意请求接口的/
  7. react学习(68)--ant design inputNumber
  8. [html] 写一个布局,当页面滚动一定高时,导航始终固定在顶部,反之恢复原位
  9. [css] 不用换行的标签,怎么伪元素实现换行的效果?
  10. 前端学习(2714):重读vue电商网站34之侧边栏路由改造