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; } }