羅区P1351(列挙)

###ロス・バレーP1351トピックリンク###

 

効果の件名:

ユニコム図なしの記事のあなたのnノード、N-1の側面。定義(u、v)は点UおよびVからの最短距離を表している場合(u、v)が2である場合、2点のプロット点の右(すなわち、Wは、Uが  Wである* 、V、ジョイントの重量として知られています)図中の完成の合計重量の最大合計重量の和。

 

分析:

1、n-1のエッジと無向連結グラフから、図を簡単にツリーのルートを含まない決定します。

2、その後、我々は、すべてのノードの全体像を通過することができ、その後、これらのノードの相対距離の息子は、ノード2があります。

図3は、二つのノードABの子ならば、それらは答えに寄与し、その後、第2のノードは、また、ABの息子のように、2つのノードを有し、そこにすることはできません。したがって、この列挙は繰り返しません。

4、論理的に言えば、我々は、加算の答えが続くこのノードのノードのすべての人の息子を、横断する必要があります。しかし、分析によって求めることができる: A-B二人の息子場合、寄与== 2 * AB(A + B)2 - (2 + B 2); 同様に、もし三人の息子、ABC、2 * ABへの寄与2 * 2 + AC + BC == *(A + B + C)2  - (2 + B 2 + C 2)。 あなたは、統計や広場を回すことができ、最終的に、あなたはそれを扱うことができます。

 図5は、最大値を決定するため:息子は、二つの右点のノード最大積ノード、つまり、Aは、結合重み親ノードの最大値です。父は合計重量ができる最大の最大のノードを取る限り。

 

コードは以下の通りであります: 

書式#include <iostreamの> 
の#include <アルゴリズム> 
書式#include < 文字列の.h>
 使用して 名前空間はstdを、
#define 200008 MAXN 
typedefの長い 長いLLを。
constの LL MOD = 10007 ;
int型nは、CNT;
int型のヘッド[MAXN]、中に[MAXN]。
LL [MAXN]。
構造体のエッジ{
     INT に、
    int型の次; 
}エッジ[MAXN << 1 ]。
インラインボイドアドオン(int型のu、int型V){ 
    エッジ[ ++ CNT] .TO = V。
    エッジ[CNT] .next = 頭部[U]。
    ヘッド[U] = CNT。
    返します
} 
int型のmain(){ 
    scanf関数(" %のD "、&N)
    int型A、B;
    以下のためにint型 I = 1 ; I <= N- 1、I ++ ){ 
        scanf関数(" %d個の%のD "、&​​A、&B); 
        (A、B)を追加し、(B、A)を加えます。
         [A] ++、中に [B] ++ ; 
    } 
    のためのINTI = 1 ; I <= N。私は()のscanf ++を" %のLLD "、および[I])。
    LL ANS = 0、RES = 0 以下のためにint型 i = 1 ; iが<= N; iは++ ){
         場合、[I] <= 1続けます
        LL S1 = 0、S2 = 0 
        MMAX LL = 0、Mmaxを= 0 ;
        INT J =頭部[I]; J; J = エッジ[J] .next){
             int型 V =エッジ[J] .TO。
            S1 =(S1 + [V])%のMOD、S2 =(S2 + [V] * [V]%のMOD)%のMOD。
            もし([V]> = MMAX){Mmaxを= MMAX; MMAXは= [V]を;}
             そうでない 場合([V]> Mmaxを)Mmaxを= [V]。
        } 
        のLL K =((S1 * S1)%MOD-S2 + MOD)%MOD。
        ANS =(ANS + K)%のMOD。
        RES = MAX(RES、MMAX * mmaxを)。
    } 
    のprintf(" %のLLD%のLLDを\ n " 、RES、ANS)。
}

 

おすすめ

転載: www.cnblogs.com/Absofuckinglutely/p/11595088.html