USACO 2010 Mar Gold 1.Great Cow Gathering

题目描述

Description

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找出最方便的地点来举行大集会。考虑一个由五个农场组成的国家,分别由长度各异的道路连接起来。在所有农场中,3号和4号没有奶牛居住。

Input

* 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

Output

* Line 1: The minimum inconvenience possible

Sample Input

5
1
1
0
0
2
1 3 1
2 3 2
3 4 3
4 5 3

Sample Output

15

题目分析:

题目是让我们找到一个点 使得这棵树里的每个点到这个距离的和最小 (点权*道路长度)
我们想 一个树里的所有的点到某个点只可能来自它的子树或者父树
那么:f[x]表示从父树的所有点到点x的距离和 g[x]表示x里的子树里的所有点到点x的距离和

g[x]=Σsize[to[i]]*val[i]+g[to[i]]
f[to[i]]=f[x]+(sum-size[to[i]])*val[i]+g[x]-g[to[i]]-size[to[i]]*val[i]

其中 size[to[i]]是子节点的子树大小 val[i]是点x到其一个子节点的边权 sum是所有点权的和
最后 记得要开Long Long

#include <cstdio>
#include <cstring>
#include <cmath>
#include <queue>
#include <algorithm>
using namespace std;
int head[110000];
int val[220000];
int to[220000];
int next[220000];
int c[220000];
int n;
long long g[110000];
long long f[110000];
long long ans=1000000000000000;
int tot;
long long sum;
long long size[110000];
void add(int x,int y,int z)
{
    next[++tot]=head[x];
    to[tot]=y;
    val[tot]=z;
    head[x]=tot;
}
void dfs(int x,int temp)
{
    size[x]=c[x];
    for(int i=head[x];i;i=next[i])
    {
        if(to[i]!=temp)
        {
            dfs(to[i],x);
            size[x]+=size[to[i]];
            g[x]+=(size[to[i]]*val[i]+g[to[i]]);
        }   
    }
}
void dfs2(int x,int temp)
{
    for(int i=head[x];i;i=next[i])
    {
        if(to[i]!=temp)
        {
            f[to[i]]=f[x]+(sum-size[to[i]])*val[i]+g[x]-g[to[i]]-size[to[i]]*val[i];
            dfs2(to[i],x);
        }
    }
}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%d",&c[i]),sum+=c[i];
    for(int i=1;i<n;i++)
    {
        int x,y,z;
        scanf("%d%d%d",&x,&y,&z);
        add(x,y,z);add(y,x,z);
    }
    dfs(1,0);
    dfs2(1,0);
    for(int i=1;i<=n;i++)
        ans=min(ans,f[i]+g[i]);
    printf("%lld",ans);
    return 0;
}

 

发表评论

邮箱地址不会被公开。 必填项已用*标注