P2986 [USACO10MAR] great cows gather Great Cow Gather

Title 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.

Bessie is planning annual rallies cows, cows from across the country in the future to participate in this rally. Of course, she would choose the most convenient location to host this gathering.

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.

Each cows living in N (1 <= N <= 100,000) in one farm, these farms are connected by road N-1, and can reach any other farm from a farm. I farm roads connecting A_i and B_i (1 <= A_i <= N; 1 <= B_i <= N), the length of L_i (1 <= L_i <= 1,000). N rally may be in any one place in farms. Further, each cow occupants of C_i (0 <= C_i <= 1,000) cows.

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.

In selecting the location of the rally when, Bessie convenient to maximize the degree of hope (that is inconvenient to minimize the degree). For example, select the first X farm as a venue, it is inconvenient to the degree of each other in the cow barn to attend the rally's journey sum (for example, from the farm to reach the farm i X is 20, then the total distance is C_i * 20). Bessie help find the most convenient location to hold large rallies.

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.

Input Format

* 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

The first line: an integer N.

The second N + 1 line: first line i + 1 has an integer C_i

Second to N + 2 row 2 * N: Line i + N + 1 integers behavior 3: A_i, B_i, and L_i.

Output Format

* Line 1: The minimum inconvenience possible

The first line: a value representing the minimum value is not convenient.

Sample input and output

Input # 1
5 
1 
1 
0 
0 
2 
1 3 1 
2 3 2 
3 4 3 
4 5 3 
Output # 1
15 

Description / Tips

Thanks @ username already exists a translation

 

 

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<queue>
using namespace std;
struct B
{
    int t,ne,d;
}a[200005];
int n,e,fr[100005],c[100005],s[100005],maxs[100005],sum;
void add(int f,int t,int d)
{
    a[++e].t=t;
    a[e].ne=fr[f];
    fr[f]=e;
    a[e].d=d;
}
void treedp(int fa,int u)
{
    s[u]=c[u];
    for (int i=fr[u];i;i=a[i].ne)
        if (a[i].t!=fa)
        {
            treedp(u,a[i].t);
            s[u]+=s[a[i].t];
            maxS [U] = max (maxS [U], S [A [I] .T]);
    int an=1;
        } 
    MaxS [U] = max (maxS [U], SUM-s [U]); 
} 
void DFS (FA int, U int) // find a shortest path only, because there has been no use s to save I click 
{// oh I is not initialized because there is only one path, only to be found once, do not need to take min, directly over the original value on the line 
    for (int i = fr [u ]; i; i = a [i] .ne) 
        ! IF (FA = A [I] .T) 
        { 
            S [A [I] .T] = S [U] + A [I] 2.d; 
            DFS (U, A [I] .T); 
        } 
} 
int main () 
{ 
    Scanf ( "% D", & n-); 
    for (int I =. 1; I <= n-; I ++) 
        Scanf ( "% D", & C [I]), SUM + = C [I] ; 
    for (int I =. 1, X, Y, Z; I <n-; I ++) 
        Scanf ( "% D% D% D", & X, & Y, & Z), the Add (X, Y, Z), the Add (Y , X, Z); 
    treedp (1,1);
    for (int I = 2; I <= n-; I ++) 
        IF (maxS [I] <maxS [AN]) // determined minimum point of maximum weight for a block point (the center of gravity of this tree.) 
            AN = I; 
    S [ an] = 0; // now that the focus of an order which is the shortest run origin 
    dfs (an, an); // shortest run 
    Long Long ANS = 0; 
    for (int I =. 1; I <= n-; I ++ ) 
        ANS + = s [i] * (Long Long) c [i]; // pure analog per farm c [i] cow running s [i] of the road 
    the printf ( "% LLD", ANS); 
}

  

Guess you like

Origin www.cnblogs.com/xiongchongwen/p/11243543.html