質問が意図されている:木に、n個の点、N-1、例えばN = 5ポイント、各完全な配列のために、N点(Nの合計!)、全ての回答の完全な配列を求めるエッジを、全体の構成は、すべての距離と3-1,1-2,2-4,4-5を求め、31245です。最終応答モードの1E9 + 7。
アイデアは:すべての完全な配列のために、我々は、Uは、V、全配列中のN-1位の合計をU及びVの寄与を生成する2つの点を考慮することができ、他の点は、n-2を有する(N-2 )!の可能な、2点の位置も、交換することができるので、隣接する点の任意の対によって生成された貢献のための2 *(N-1)*(N-2)!* S(距離) 。
その問題は、各側の貢献のために形質転換することができる任意の2点間の距離を計算することで、各エッジに対して、それは、このエッジによって生成される寄与は、ツリーが左右の部分に分割され、つまり、このエッジへの貢献の数、およびそれがDFSによって、左右の点の各エッジを見つけることは容易である、二つの部分にポイント数を乗じ、答えが出てきました。
#include <ビット/ STDC ++ H>
使用して 名前空間STDを、
const int型 MAXN = 2E5 + 10 。
#defineっ長い長
のconst int型 MOD = 1E9 + 7 。
int型のヘッド[MAXN]、NXT [MAXN]、エッジ[MAXN]、[MAXN]版。
int型 TOT = 0 ;
int型のn;
ボイド追加(INT U、INT V、INT W)
{
版[ ++ TOT = V。
エッジ【TOT] = W。
NXT [TOT] = 頭部[U]。
ヘッド[U] = TOTを、
}
INT D [MAXN]、CNT。
INT DFS(INT U、INT FA、INT W1)
{
int型 =合計1 。
以下のために(int型 I =ヘッド[U]; I; I = NXT [I])
{
int型 V = 版[I];
INT W = エッジ[I]。
もし(== FA V)続けます。
和 + = DFS(V、U、W)。
}
D [ ++ CNT] =(LL)の合計*(N-和)* W1%MOD。
戻り値の合計。
}
int型)(主
{
一方、(〜のscanf(" %d個"、&N))
{
TOT = 0 。
memsetの(頭、0、はsizeof (ヘッド))。
memset(NXT、0、はsizeof (NXT))。
memsetの(D、0、はsizeof (d)参照)。
以下のために(int型 I = 1 ; I <= N- 1、I ++ )
{
int型、U、V、W。
scanf関数(" %D%D%D "、およびuは、&V、およびW)
(U、V、W)を加えます。
(V、U、W)を追加。
}
CNT = 0 。
DFS(1、0、0 );
LL合計 = 0 ;
以下のために(int型 i = 1 ; iは= CNTを<; iは++ )
合計 + = D [i]は%MOD。
以下のために(int型 I = 1 ; I <= N- 1 ; I ++ )
合計 =合計* I%のmod。
合計 =合計* 2%のMOD。
printf("%D \ n " 、合計)。
}
}