P2986 [USACO10MAR]偉大な牛の収集グレート牛を集めます

タイトル説明

ベッシーはすべて全国の牛が集まる毎年恒例の大牛を計画していると、当然のことながら、彼女は場所を取るために収集するための最も便利な場所を選択したいと思います。

ベッシーはこのラリーに参加するために将来的には全国から毎年恒例の集会牛、牛を計画しています。もちろん、彼女はこの集会を開催するための最も便利な場所を選ぶだろう。

各牛は、Nのいずれかに住んでいる(1 <= N <=10万)は、他に任意の納屋から取得することが可能であるような方法で、N-1の道路で接続されている異なる納屋(好都合番号1..N)道路を経由して納屋。道路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ファーム内のN(1 <= N <=10万)に住んでいる各牛は、これらの農場は、道路N-1で接続されている、ファームからその他のファームに到達することができます。a_iをとB_iを接続するI農道(1 <= a_iを<= N、1 <= B_i <= N)、L_iをの長さ(1 <= L_iを<=千)。Nラリーは、農場でのいずれかの場所にあってもよいです。さらに、C_Iの各牛乗員(0 <= C_I <=千)牛。

牛の収集を保持するために納屋を選択する際、ベッシーは、選択された位置の(不便を最小化すると言うことである)利便性を最大化することを望みます。(I納屋のXへの納屋からの距離は、20その後、走行距離が* 20 C_Iがされている場合、すなわち)収集のための納屋Xを選ぶの不便は牛のすべてが納屋Xに到達するために移動する必要がある距離の合計であります。ベッシーは偉大な牛の収集のための最も便利な場所を選択するのに役立ち。

希望の程度を最大化するために、ベッシーは便利な集会の場所を選択するには(それが度を最小化するのは不便です)。例えば、会場などの第1のXファームを選択し、ファームI Xに到達するために、例えば、ファームから(ラリーの旅の和に出席するために牛の納屋で互いに度に不便であり、その後の総距離は、20でありますC_I * 20)。ベッシーは、大規模な集会を開催するための最も便利な場所を見つけるのに役立ちます。

様々な長さの様々な道路によって接続【様々な容量]を有する5つの納屋で国を考えます。納屋のこのセットでは、納屋3や納屋4軒の家屋任意の牛でもありません。

1 3 4 5

@ - 1 - @ - 3 - @ - 3 - @ [2]

[1] |

2 | @ [1] 2ベッシーは5つの納屋のいずれかにギャザリングを保持することができます。ここでは、各可能な場所について計算不便の表には、次のとおりです。

-----不便を収集------

場所B1 B2 B3 B4 B5合計

1 0 3 0 0 14 17

2 3 0 0 0 16 19

3 1 2 0 0 12 15

4 4 0 0 6 15

5 7 8 0 0 0 15

ベッシーは納屋1の収集を保持している場合、各納屋から不都合があります。

納屋1 0 - そこには旅行時間!

納屋2 3 - 総走行距離は2 + 1 = 3×1牛です= 3納屋3 0 - そこには牛!

納屋4 0 - そこには牛!

バーン5 14 - 総走行距離は、したがって総不都合が17である3 + 3 + 1 = 7×2頭の牛= 14です。

可能な限り最高の利便性が納屋3、4、または5で収集を保持することによって、15、達成可能です。

入力形式

* 1行目:単一の整数:N

*行2..N + 1を:C_I:回線I + 1は、単一の整数が含まれています

*行N + 2..2 * N:a_iを、B_i、およびL_iを:私はN + 1 +ラインは三つの整数が含まれています

最初のライン:整数N.

第N + 1行目:最初の行は、I + 1の整数C_Iを有します

第2のn + 2行2 * Nへ:a_iを、B_i、およびL_iを:i線はN + 1つの整数行動3を+。

出力フォーマット

* 1行目:最小不便可能

最初のライン:最小値を表す値が便利ではありません。

サンプル入力と出力

入力#1
5 
1 
1 
0 
0 
2 
1 3 1 
2 3 2 
3 4 3 
4 5 3
出力#1
15 

説明/ヒント

ありがとう@ユーザー名は既に翻訳が存在します

 

 

書式#include <アルゴリズム> 
書式#include <iostreamの> 
の#include <CStringの> 
の#include <cstdioを> 
する#include <cmath> 
の#include <キュー> 
std名前空間を使用しました。
構造体B 
{ 
    int型のT、NE、D。
} [200005]。
MAXS [100005]、S [100005]、[100005] C、E、FR [100005]、N INT、合計。
ボイド追加(int型のF、int型のT、int型D)
{ 
    [++ E] .T = T。
    [E] .NE = FR [F]。
    FR [F] = E。
    [E] .D = D。
} 
ボイドtreedp(int型FA、UをINT)
{ 
    S [U] = cで[U]。
    以下のために(; I; I = frの[U]をint型iは= [I] .NE)
        IF([I] .T = FA!)
        { 
            treedp(U、[I] .T)。
            S [U] + = sで[I] .T]。
            MAXS [U] = MAX(MAXS [U]、S [i]が.T])。
        } 
    MAXS [U] = MAX(MAXS [U]、SUM-S [U]); 
} 
無効DFS(FA int型、U INT)Iを保存するためには使用Sがなかったので、唯一の最短パスを//検索しますクリック
一度だけ発見される唯一の道があるので、私が初期化されていないああ、直接ライン上の元の値の上に、分を取る必要はありません// { 
    ([U I = FRをint型のための私;私は、[I]を=] .NE)
        !IF(FA = A [I] .T)
        { 
            S [A [I] .T] = Sの[U] + [I] 2.D、
            DFS(U、A [I] .T)。
        } 
} 
int型のmain()
{ 
    scanfの( "%のD"、およびN-)を、
    ため(INT I = 1; I <= N; I ++の)
        scanfの( "%のD"、&C [I])、SUM + = C [I] ; 
    (。; I <N-I ++はI = 1、X、Y、Z INT)のための
        scanfの( "%D%D%D"、およびX&Y、およびZ)、追加(X、Y、Z)、追加(Y 、X、Z); 
    treedp(1,1)
    = 1 INT。
    以下のために(INT I = 2; I <= N; I ++の)
        IF(MAXS [I] <MAXS [])// ブロックポイントの最大量の最小点(このツリーの重心)を決定し
            、AN = I; 
    S [] = 0; //これそのための焦点います原点実行最短
    DFS(); //最短ラン
    長ロングANS = 0; 
    のための(INT I = 1; I <= N - 、Iは++)
        ANS + = S [I] *(ロングロング)C [ i]は、ファームのC [あたり//純粋なアナログI]ウシ実行S [i]は、道路の
    のprintf( "%のLLD"、ANS); 
}

  

おすすめ

転載: www.cnblogs.com/xiongchongwen/p/11243543.html