タイトルの意味
コンピュータ最も遠い各コンピュータの長さを調べます
トピック分析
ノードvについて、そのサブツリー内の最長場合、我々は、DPを取る[U] [0]
そうでない場合は、最大長さは、その親ノードUを通過する、vが最大最長の長さ= DIS(U、V)+のUであります
最初の場合、最長経過U、Vの子ノードは、明らかに望ましくない最長の長さの長さは、その後、私たちは第二の長いDPの長さに行くかどう[U] [1]
Uなしの最長の長さは、子ノードをV場合には、第2ケースは、その後、uはDP最長の長さを取る[U] [0]
したがって、各ノードは、サブツリー最長の距離DPを必要とする[U] [0]、第長距離DP [U] [1]
計算の便宜のためだけでなく、親ノードの後最長の距離DPを必要[U] [2]
このプロセスでは、より詳細な表情ブロガーもブログを
トピックコード
書式#include <stdio.hに> する#include <iostreamの> 書式#include < 文字列の.h> 使用して 名前空間はstdを、 const int型 MAXN = 1E4 + 7 。 int型、N、Q、A、B、C、TOT。 int型のヘッド[MAXN]、DP [MAXN] [ 3 ]、最長[MAXN]。 構造体ノード{ int型、次に、Wに対して、 }エッジ[MAXN * 2 ]。 ボイド追加(INT U、INT V、INT W){ エッジ[TOT] .TO = V。 エッジ【TOT] .W = W。 縁【TOT] .next= ヘッド[U]。 ヘッド[U]は ++ TOTを= 。 } INT DFS1(INT U、INT FA){ 場合(DP [U] [ 0 ]> = 0)戻り DP [U] [ 0 ]。 DP [U] [ 0 ] DP [U]を= [ 1 ] DP [U]を= [ 2 ]最長= [U] = 0 ; 以下のために(int型 - ;!I = I =ヘッド[U] 1 ; I = {エッジ[I] .next) のint V = エッジ[I] .TO。 もし(== FA V)続けます。 もし(DP [U] [ 0 ] <DFS1(V、U)を+ エッジ[I] .W){ DP [U] [ 1 ] DP [U] [= 0 ]。 DP [U] [ 0 ] = DFS1(V、U)+ エッジ[I] .W。 最長[U] = V。 } そう であれば(DP [U] [ 1 ] <DFS1(V、U)+ エッジ[I] .W){ DP [U] [ 1 ] = DFS1(V、U)+ エッジ[I] .W。 } } 戻り DP [U] [ 0 ]。 } ボイド DFS2(int型 U、int型のFA){ ため(INTI =ヘッド[U]; I =! - 1 ; I = エッジ[I] .next){ int型 V = エッジ[I] .TO。 もし(== FA V)続けます。 もし(V ==最長[U])DP [V] [ 2 ] = MAX(DP [U] [ 1 ]、DP [U] [ 2 ])+ エッジ[I] .W。 他 DP [V] [ 2 ] = MAX(DP [U] [ 0 ]、DP [U] [ 2 ])+ エッジ[I] .W。 DFS2(V、U); } } int型のmain(){ ながら(〜のscanf(" %d個"、&N)){ TOT =0 ; memsetの(頭、 - 1、はsizeof (ヘッド))。 memsetの(DP、 - 1、はsizeof (DP))。 memsetの(最長、 - 1、はsizeof (最長))。 以下のために(int型私= 2 ; iが<= N; iが++ ){ scanf関数(" %D%D "、&、&B)。 (私は、b)の追加/ * 追加、(I、a、b)は* / ; } DFS1(1、0 ); DFS2(1、0 ); 以下のために(int型私= 1 ; iが<= N; iが++ ) のprintf(" %d個の\ n "、MAX(DP [I] [ 0 ]、DP [I] [ 2 ]))。 } 戻り 0 。 }