HDU6446

 

HDU6446

 

質問が意図されている:木に、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(100 ); 
        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 " 、合計)。
    } 
}

 

おすすめ

転載: www.cnblogs.com/dongdong25800/p/11070163.html