题目描述

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]2Bessie 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

题解:树形dp;感觉洛谷上的题解比我讲的好,所以复制了一段:
   思路就是先假设所有奶牛都到一个点了,然后就可以从这个点推出所有点的状态,O(n)的动态规划,其实就是一维(也可以不用数组),我们记录每个点他的所有儿子节点(包括儿子节点的节点)的奶牛总数son[i],dp[v]=dp[rt]-son[v]*a[i].w+(sum-son[v])*a[i].w;(sum是所有奶牛数总和),预处理的时候我们把所有点到第一个点的距离,接下来就可以愉快的处理出dp[1]了,然后就是一边DFs的动态规划并且每次比较取答案。(感谢 cheeseYang)

   

考虑如果依次枚举每一个点作为集会的地点

使用DFS进行计算

然后再依次比较

时间复杂度O(n^2)

但是n的范围太大,显然会超时。

那么,我们应当如何优化?

先看看样例

通过一次O(n)的计算,很容易得出来

如果选择1号节点,答案就是17

既然O(n^2)的计算无法在时间内求解

那么是否可以递推出来呢?

显然是可以的。

观察如果已经知道1号节点所需的时间

那么,我们可以做如下假设:

① 所有的牛首先到达了1号节点

② 3号节点以及他子树上的节点都需要退回1->3的路径的长度

③ 除了3号节点以及他子树上的节点都需要前进1->3的路径的长度

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

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

 #include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
using namespace std;
#define man 200100
#define ll long long
ll n,m,a[man],ans=,sum=;
ll son[man],dis[man<<];
struct edge
{
ll next,to,dis;
}e[man];
ll num=,head[man<<];
ll f[man];
inline void add(ll from,ll to,ll dis)//添边
{
e[++num].next=head[from];
e[num].to=to;
e[num].dis=dis;
head[from]=num;
}
ll dfs(ll u,ll father)//找出所有关于1节点的距离和
{
ll tot=;
for(ll i=head[u];i;i=e[i].next)
{
ll to=e[i].to;
if(to==father)continue;
ll d=dfs(to,u);
dis[u]+=dis[to]+e[i].dis*d;
tot+=d;
}
return son[u]=tot+a[u];
}
void sch(ll u,ll father)//求出代价f[]
{
for(ll i=head[u];i;i=e[i].next)
{
ll to=e[i].to;
if(to==father)continue;
f[to]=f[u]-son[to]*e[i].dis+(sum-son[to])*e[i].dis;//方程
sch(to,u);
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie();
cin>>n;
for(int i=;i<=n;i++)
{ cin>>a[i];sum+=a[i];}
for(int i=,x,y,d;i<n;i++)
{
cin>>x>>y>>d;
add(x,y,d);add(y,x,d);
}
memset(f,,sizeof(f));
dfs(,);
sch(,);
ans=f[];
for(int i=;i<=n;i++)
ans=min(ans,f[i]);
cout<<ans+dis[]<<endl;
return ;
}

注:此题不能直接在main()中直接求f[],因为此时并不知道f[1]的取值,所以仍需一次遍历。

洛谷 P2986 [USACO10MAR]伟大的奶牛聚集Great Cow Gat…(树规)的更多相关文章

  1. [洛谷P2986][USACO10MAR]伟大的奶牛聚集Great Cow Gat…

    题目大意:给你一棵树,每个点有点权,边有边权,求一个点,使得其他所有点到这个点的距离和最短,输出这个距离 题解:树形$DP$,思路清晰,转移显然 卡点:无 C++ Code: #include < ...

  2. 【题解】Luogu p2986 [USACO10MAR]伟大的奶牛聚集Great Cow Gat 树型dp

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

  3. 洛谷 P2986 [USACO10MAR]伟大的奶牛聚集(树形动规)

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

  4. BZOJ 1827 洛谷 2986 [USACO10MAR]伟大的奶牛聚集Great Cow Gather

    [题解] 很容易想到暴力做法,枚举每个点,然后对于每个点O(N)遍历整棵树计算答案.这样整个效率是O(N^2)的,显然不行. 我们考虑如果已知当前某个点的答案,如何快速计算它的儿子的答案. 显然选择它 ...

  5. P2986 [USACO10MAR]伟大的奶牛聚集Great Cow Gat…

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

  6. LUOGU P2986 [USACO10MAR]伟大的奶牛聚集Great Cow Gat…

    传送门 解题思路 首先第一遍dfs预处理出每个点的子树的siz,然后可以处理出放在根节点的答案,然后递推可得其他答案,递推方程 sum[u]=sum[x]-(val[i]*siz[u])+(siz[1 ...

  7. [USACO10MAR]伟大的奶牛聚集Great Cow Gat…【树形dp】By cellur925

    题目传送门 首先这道题是在树上进行的,然后求最小的不方便程度,比较符合dp的性质,那么我们就可以搞一搞树形dp. 设计状态:f[i]表示以i作为聚集地的最小不方便程度.那么我们还需要各点间的距离,但是 ...

  8. [USACO10MAR]伟大的奶牛聚集Great Cow Gat…

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

  9. [USACO10MAR]伟大的奶牛聚集Great Cow Gat… ($dfs$,树的遍历)

    题目链接 Solution 辣鸡题...因为一个函数名看了我贼久. 思路很简单,可以先随便指定一个根,然后考虑换根的变化. 每一次把根从 \(x\) 换成 \(x\) 的一个子节点 \(y\),记录一 ...

随机推荐

  1. sed命令n,N,d,D,p,P,h,H,g,G,x解析

    1.sed执行模板=sed '模式{命令1;命令2}'即逐行读入模式空间,执行命令,最后输出打印出来2.为方便下面,先说下p和P,p打印当前模式空间内容,追加到默认输出之后,P打印当前模式空间开端至\ ...

  2. 求助OPC Opc.IDiscovery m_discovery = new OpcCom.ServerEnumerator();

    各位大哥们,大家好,在此请教各位一个问题,谢谢大家.我在vs2010中引用了OpcNetApi.dll和OpcNetCom.dll并且加入了using Opc;using Opc.Da;using O ...

  3. DRF 解析器组件

    Django无法处理application/json协议请求的数据,即,如果用户通过application/json协议发送请求数据到达Django服务器,我们通过request.POST获取到的是一 ...

  4. EasyUI treegrid 删除一条或多条记录

    function del_dg() { $.messager.defaults = { ok: "是", cancel: "否" }; var node = $ ...

  5. 第三方登录之微信登录,基于ThinkSDK

    本文基于ThinkSDK,为其补充微信登录demo 增加ThinkSDK的微信第三方登录 阅读本文之前请先了解ThinkSDK的文档 http://www.echomod.com/nexstep/fo ...

  6. nginx web服务优化

    nginx基本安全优化 1. 调整参数隐藏nginx软件版本号信息 软件的漏洞和版本有关,我们应尽量隐藏或消除web服务对访问用户显示各类敏感信息(例如web软件名称及版本号等信息),这样恶意的用户就 ...

  7. DynamicConverter

    folly/DynamicConverter.h When dynamic objects contain data of a known type, it is sometimes useful t ...

  8. 源码安装nginx

    #!/bin/bash #安装nginx依赖 apt-get update apt-get install -y make apt-get install -y gcc apt-get install ...

  9. 记录AUTO_SPACE_ADVISOR_JOB导致负载异常

    早上上班,检查数据库,发现监控日志中在晚上1点到4点钟服务器异常负载现象,查看awr日志发现AUTO_SPACE_ADVISOR_JOB运行异常0.数据库版本 SQL> select * fro ...

  10. 数据库DRDS中间件介绍

    DRDS/TDDL alibaba. Distributed Relational Database Service. 阿里分布式数据库DRDS的前身是淘宝分布式数据库层TDDL,大概在2012年的时 ...