タイトル説明
小さなQ Q学習は、電子回路基板技術のトレーニングコースにはんだ付けされました。要素の数によって回路基板は、我々は、そのデジタルでノードを呼び出す可能性が1,2,3 ... 1 、2 、3 参考のために...。各ノードは、ディスジョイント導体複数の、回路基板の任意の2つのノードのために回路基板に接続され、そして(パスは、2つの導体の配列を連結するための手段)一つだけのパスが存在しています。
回路基板上の特定の要素の存在下で、「トリガ」と呼ば 励起を操作する場合、ノードそれのそれぞれに接続されたワイヤを通過した励起電流を生成します。励磁電流を受信後の中間ノード、情報を取得し、それを広げ、ノードに接続する通電励磁電流を受信していません。もはや転送される励磁電流を受けていない後にノード - 最後に、強烈な電流は、いくつかの「端末ノード」に到達します。
ワイヤ上の励磁電流をさ伝播する各エッジに対して、時間がかかりE 、それはのために励磁電流要する時間によって、E t_e T Eを、ノードは、受信された励磁電流が瞬間的であると考えることができる転送します。すなわち、同期保持状態-ボードは、現在得られた励磁回路ながら、各「終端ノード」を必要とします。構造は、現在の時間同期要件を満たしていないので、接続線の構成を変更することにより、必要とします。現在、小さなQ 励磁電流は、接続ストリップ導体を1単位時間によって増加することができるように、Qは、支柱と、支柱を持っています。Qは小さな同期状態何回小道具の最小使用が可能なすべての「エンド・ノード」となるようウィル?
入力形式
最初の行は、正の整数含まN 、Nを回路基板内のノードの数です。
第二行は、整数含まS 励磁回路基板用番号Sを、。
次に、N. 1- N. 三つの整数の1行A、B、T 、A 、B 、T. これは、意味、このワイヤ接続ノードA AとノードBのB、及びこれらのワイヤによって必要とされる励磁電流T 時間のT単位。
出力フォーマット
それだけで1つの整数含まVのV、小さなQの最低使用周波数とQの小道具を。
サンプル入力と出力
3 1 1 2 1 1 3 3
2
説明/ヒント
以下のための40 \%。4 0 データの%、N≤1000年N ≤ 。1 0 0 0
以下のための100 \%。1 0 0 %データ、N 500000≤ N ≤ 5 0 0 0 0 0
すべてのデータに対して、t_e 1000000≤ T E ≤ 。1 0 0 0 0 0 0
分析:
各リーフノードと同等の必要な重量に到達するルートから、ツリーとその各辺の右側を考えると、少なくともどのように多くの時間を変更する必要があります:まず、問題がに変換することができますか?
各葉から右ノードにF [i] [j]はサブツリーのルートと私のノードを示し、Iを設定した値は、リーフノードの値jの最小数を変更して到達する権利等しいです。
X1、X2、X3、X4の息子ノードiのために.....
F [I] = MAX(F [XI] + E [I] .W)。
変更+ =Σ{F [i]が - (F [XI] + E [I] .W)}。
出力ANS缶!
唯一のn-1辺ための入力データ、N個のノードを参照し、ツリーを参照することは困難です。私たちは、その後、これらの信号は同時に、ルートノードに到達、思考が同時にすべてのリーフノードは、信号を送るようにすることです対抗することができます。だから我々は、信号が同時にノードの各ノードに到達するように、すべての子ノードを下に維持することができます。
だから我々は維持する方法を検討します。最初のノードは、ノードの最大右側を維持するために、ノードに戻って、我々はリーフノードの検索にルートノードから検索を開始するすべての子のメンテナンスは、(右側が、それは時間がかかると同時に到着するリーフノードです)。そして、その答えを維持するため、答えは最大右側マイナスすべての子ノードの右側があります。最大の右側と親ノード、ノードの親ノード+時間に子ノードの右側の親ノードのメンテナンスの右側。次いで、バックトラック操作は、ルートノードまで、繰り返されます。もう少し明確に注釈を付けご覧QWQああはっきり言うのは難しいです
その後、我々はいくつかの詳細に注意を払う必要があります。
- 双方向側を追加してください、それは無向グラフです。
- それは無向グラフであるため、親ノードの保守側が算出されないものです。
- 秩序を維持することは任意であってはなりません。
- 答えは長い長いメモリを使用します。
コード:
#include <ビット/ STDC ++ H>
の#define MAXN 1000005
名前空間stdを使用。
構造体のエッジ{に、次のDISをint型;}エッジ[MAXN]。
INTのN、S、B、T、MAXN [MAXN]、CNT、ヘッド[MAXN]。
長い長いANS;
ボイドaddedge(から整数へのint、int型のDIS)
{
エッジ[++ CNT] [から] .next =ヘッド。
エッジ[CNT] .TO =であり;
エッジ[CNT] .DIS = DIS。
ヘッド= CNT [から]。
}
ボイドDFS(int型のx、int型FA)
{
ため(INT I =ヘッド[X]; I; I =エッジ[I] .next)
IF(!エッジ[I] .TO = FA)DFS(エッジ[I]。 X)。
(; I I =エッジ[I] .next int型I =ヘッド[X])のための
IF(!エッジ[I] .TO = FA)MAXN [X] = MAX(MAXN [x]は、エッジ[I]。 DIS);
(; I I =エッジ[I] .next I =ヘッド[X] INT)のための
IF(!エッジ[I] .TO = FA)ANS + =(MAXN [X] -EDGE [I] .DIS)。
(I =ヘッド[FA] int型; I; I =エッジ[I] .next)ため
(エッジ[I] .TO == X)であれば、エッジ[I] .DIS + = MAXN [X]。
}
INTメイン()
{
scanf関数( "%d個の%のD"、&N、&S)。
以下のために(iは++; iがn-1 = <I = 1 INT)
{
( "%D%D%D"、&、&B、&T)のscanfと、
addedge(B、T)。
addedge(B、T)。
}
DFS(S、0);
printf( "%LLDする\ n"、ANS)。
0を返します。
}