どの-遠く離れLCA-hdu2586

N村の家々と、それらを結ぶいくつかの双方向の道路があります。毎日peoleは常に、これは「私は家のBに家Aから移動する場合、それはどのくらいです」のようにお願いしたいですか?通常はハード答えます。しかし、幸運なことにこの村をint答えは道路が途中で構築されているので、独自のシンプルなパスがあることを、常に一意であるすべての両院間(「シンプル」はあなたが二度場所を訪れることができないことを意味します)。Youtのタスクは、これらすべての好奇心が強い人に答えることです。

InputFirstラインは、テストケースの数を示し、T(T <= 10)単一の整数です。 
  各テストケースのために、最初の行に二つの数字N(2 <= N <= 40000)およびM(1 <= M <= 200)、住宅の数および照会の数があります。次のn-1行家iおよび家jを結ぶ道路が存在することを意味各なる3つの数字単一空間府分離I、J、K、、、長さK(0 <K <= 40000)を用いて選択図家であります1からnまで標識。 
  次のm行はそれぞれ、i、jは、あなたが家iと家j.OutputFor各テストケースは、出力メートルラインの間の距離を答えるareato異なる整数値を持っています。各行は、クエリの答えを表します。各テストcase.Sample入力後の出力当たり障りのないライン

2 
3 2 
1 2 10 
3 15 1 
1 2 
2 3 

2 2 
1 2 100 
1 2 
2 1

サンプル出力

10 
25 
100 
100 

裸LCAチェック及びアナログ・セットであるが、乗算器LCA、2桁のグループと、各ストレージ点祖先場合があり、その後バイナリLCAの上方ランを押し、複雑さを低減することができるnlognしかし、ダウン魅力的な、最新の最初ではないかもしれない。このようにして得られた注意してください。
const  int型 MAX = 0x7ffffff 構造体R {
     int型のFA、LEN。
}。
R FA [ 40005 ]。
int型のlen [ 40005 ]; 
マップ < int型int型 > チー;
ボイド解く()
{ 
    int型N、I、J、M。
    CIN >> N >> M。
    以下のためにint型 i = 1 ; iが<= N; iは++)FA [I]の.Fa = I、FA [i]が.LEN = 0 (i = 1 iが++; iがn < ){
         int型、B、C。
        scanf関数( FA [A]の.Fa。" %D%D%D "、&​​、&B、&C)。
    //     場合(A> B)スワップ(B)
        FA [A]の.Fa = B。
        FA [A] .LEN = C。
    } 
        
    一方(M-- ){
         int型、B、和(0 )。
        CIN >> A >> B; 
        qi.clear(); 
        合計 = 0 ; 
        チー[A] = 合計。
        一方、(!FA [A]の.Fa = A){ 
            合計 + = FA [A] .LEN。=合計。
            チー[A] = 
        } 
        チー[A] = 合計。
        合計 = 0 ;
    //     COUT <<チー[A] << ENDL。
        一方、(qi.count(B)== 0 ){ 
            
            合計 + = FA [B] .LEN。
            B = FA [B]の.Fa。
        //     coutの<< ":" << B <<てendl; 
        }  + = チー[B]。
        coutの <<合計<< てendl; 
        
    } 
    
}

 

おすすめ

転載: www.cnblogs.com/wengsy150943/p/10991092.html