P3128 [USACO15DEC】最大流量最大流量(差動木)

タイトル説明

ファーマージョンは、新しいシステムがインストールされている  N-1 Nを- との間に牛乳輸送する1本のパイプ  N 彼の納屋でNの屋台を(2 \当量のN \の当量50,000 2 N 5 0 0 0 便利番0)、  1 \をldots N 1 ... Nで各パイプは、ストールの対を接続し、すべてのストールは、パイプの経路を介して、相互に接続されています。

FJは間牛乳をポンピングされる  K ストールのK対(1 \当量K \当量10万1 K 1 0 0 0 0 0)。以下のために  私は、このようなペア番目、あなたは、二つの屋台言われて  S_I S I  と  T_I トンを私は、ミルクが単位レートで励起され、それに沿ってパスのエンドポイントを。FJは、ストールがの多くに沿ってウェイポイントとして機能することができますので、いくつかの屋台が、それらを介してポンピングされるすべての牛乳に圧倒終わるかもしれないことを懸念している  Kミルクが圧送されているに沿ってKパス。彼はどんなストールを介してポンピングされている牛乳の最大量を決定するのに役立ちます。牛乳はからのパスに沿って圧送されている場合は  、S_I 私が する  T_I トンに私を、それはエンドポイントのストールを介してポンピングされているものとしてカウントさ  S_I S I  と

T_I トン、私だけでなく、それらの間のパスに沿ってすべての失速による。

入力形式

入力の最初の行は含ま  N Nおよび  K K.を

次の  N-1 N - 1行それぞれは、2つの整数を含む  XのXと  Yのyは(X \ NE Y X Y)パイプを記述

ストールの間  のx のx及び  Y軸Y。

次  K K線はそれぞれ2つの整数含む  のS 、Sと  Tのエンドポイントを記述するTを

ミルクが圧送されてされる経路の屋台。

出力フォーマット

牛乳の最大量を指定する整数で任意失速を通してポンピング

納屋。

サンプル入力と出力

入力#1

5 10 
3 4 
1 5 
4 2 
5 4 
5 4 
5 4 
3 5 
4 3 
4 3 
1〜3 
3 5 
5 4 
1 5 
3 4

出力#1

9

アイデア:

いくつかの修正が木のパスを依頼するために、我々は木の違いに直接任意の問題を解決することができ、統計的な問題は、Uに2点の間に違いがあることができ> LCA(U、V)LCA(U、V) - > V差を分割することができますこの問題は、我々は、各点の差が答えるために、最後のDFSスイープを超える統計の配列を維持して修正することができることは明らかであるLCAポイント差と差動側が唯一の違いは、異なる操作です。(この質問はカードアウトベクトル(私は欠陥がWAがMLE再かもしれ...)チェーンとスターが住むことができる前に書きました)

プロパティ(実際の重量は、すべての差分と木の後にポイント内の点の重みです

#include <ビット/ STDC ++ H>
 使用して 名前空間STDを、
constの ダブル PI = ACOS( - 1.0 )。
CONSTの INT N = 5E4 + 7 const  int型 INF = 0x3f3f3f3f constの ダブル EPS = 1E- 6 
typedefの長い 長いLL。
CONST LL MOD = 1E9 + 7 構造体縁{
     INT 次、V。
}。
エッジe [N << 1 ]。
int型のヘッド[N]、CNT、F [N] [ 30 ]、D [N]。
INT ヴァル[N]。
ボイド追加(INT U、INT V){ 
    E [ ++ CNT] = (エッジ){ヘッド[U]、V}。
    ヘッド[U] = CNT。
} 
int型のT。
ボイド DFS(INT U、INT FA){ 
    D [U]は、D [FA] + = 1 以下のためにint型 ; I I = I =ヘッド[U] {E [I] .next)
         int型、V = E [I] .V。
        もし(== FA V)続けます
        F [v] [ 0 ] = U。
        以下のためのint型J = 1 ; J <= T; J ++ 
            [V] [j]はfを fは= [[V] F [J- 1 ]] [J- 1 ]。
        DFS(V、U); 
    } 
} 
int型 LCA(int型のx、int型のY){
     場合(D [X]> D [Y])スワップ(X、Y)
    int型 ; I> = I = Tを0 ; i-- 場合は、Y =(D> = D [X] [Y] [I] [F])[I] F [Y]。
    もし(x == y)は戻りX。
    int型 ; I> = I = Tを0 ; i-- 場合X = F(![X] [I] = F [Y] [I] F)[X] [i]は、Y = F [Y] [I]。
    戻り [X] [F 0 ]。
} 
INT ANS = - INF。
ボイド解く(int型 U、INT FA){
     ためint型のI =ヘッド[U]は、I; I = E [I] .next){
         int型、V = E [I] .V。
        もし(== FA V)続けます
        (V、U)を解きます。
        ヴァル[U] + = valの[V]。
    } 
    ANS = MAX(ANS、ヴァル[U])。
} 
int型のmain(){ 
    IOS :: sync_with_stdio()。
    cin.tie(0)。cout.tie(0 )。
    int型 N、K。CIN >> N >> K。
    T = LOG2(N)+ 1 以下のためにint型 i = 1 ; iがn <; iは++ ){
         int型 Uを、V。CIN >> U >> V; 
        (V、U)を追加します。(V、U)を追加。
    } 
    DFS(10 );
    以下のためにint型私= 1 ; iが= Kを<; Iは++ ){
         int型 S、T。CIN >> S >> トン。
        INTの LCA = LCA(S、T)。
        ヴァル[S]++; ヴァル[T] ++; ヴァル[LCA] - 。ヴァル[LCA] F [ 0 ]] - 
    } 
    解決(10 ); 
    coutの << ANS << てendl; 
}
コードの表示

おすすめ

転載: www.cnblogs.com/wmj6/p/11426754.html