【洛谷2986】【USACO10MAR】伟大的奶牛聚集

题面

题目描述

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/416344.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

工作73:获取id值

this.$route.params,id取值

hdu 5785 Interesting(manacher+前缀和)

题目链接&#xff1a;hdu 5785 Interesting 题意&#xff1a; 有一个长度为n的串&#xff08;n<10^6&#xff09;&#xff0c;对 1 < i < j < k < length(s) . 如果[i&#xff0c;j]和[j1,k]都是回文串。则对答案的贡献为 i*k ,求贡献和。 题解&#xff1a; 详细…

工作74:vue带参数跳转其他页面

1.准备好两个vue文件 panda.vue travel.vue 2.写index.js配置文件 import travel from /components/travel1{path: /travel/:id,name: 测试页面,component: travel}3.编写跳转前的页面 这是一个点击事件 gettravel(id) {this.$router.push({path: /travel/ id,})}},1234567 …

洛谷 3381 【模板】最小费用最大流

https://www.luogu.org/problem/show?pid3381 题目描述 如题&#xff0c;给出一个网络图&#xff0c;以及其源点和汇点&#xff0c;每条边已知其最大流量和单位流量费用&#xff0c;求出其网络最大流和在最大流情况下的最小费用。 输入输出格式 输入格式&#xff1a; 第一行包…

自己定义ViewGroup控件(一)-----gt;流式布局进阶(一)

main.xml <?xml version"1.0" encoding"utf-8"?> <com.example.SimpleLayout.MyLinLayout xmlns:android"http://schemas.android.com/apk/res/android" xmlns:tools"http://schemas.android.com/tools" android:layout_wi…

【C++11/17】std::map高效插入

我们在使用stl的映射容器std::map时&#xff0c;经常需要向容器中插入数据。由于map的元素key值是唯一的&#xff0c;我们经常遇到这样的场景&#xff1a; 向map中插入元素时&#xff0c;指定的key已经存在则直接更新&#xff1b;指定的key不存在&#xff0c;然后才做插入操作…

oracle选择外键列,Oracle外键列上是否需要索引?

外键列上缺少索引会带来两个问题&#xff0c;限制并发性、影响性能。而这两个问题中的任意一个都可能会造成严重性能问题。 无论是Or外键列上缺少索引会带来两个问题&#xff0c;限制并发性、影响性能。而这两个问题中的任意一个都可能会造成严重性能问题。无论是Oracle的官方文…

linux命令行sip电话,基于Linux和MiniGUI的SIP电话终端设计

0 引言随着VoIP的迅猛发展&#xff0c;越来越多的个人用户正在使用软件电话、IP电话通过VoIP系统拨打国内和国际长途&#xff0c;IP电话的需求量越来越大&#xff0c;同时&#xff0c;人们对IP电话的要求也越来越高&#xff0c;例如要求IP电话体积小、方便携带、功耗低、待机时…