効果の件名:
ユニコム図なしの記事のあなたの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)。
}