質問の意味:木を考えると、それぞれの木を求めているの最も遠い地点に到達することができます
アイデアは:検索は、二度、一度、一度答えを見つけるために、最も遠い記録しました
F [X]と[0]のサブツリー内の最大距離を表し、X、XとF [X] [1] xのメチン距離サブツリーを表し、
F [X]と[2]の最大距離をとることができ、xの父親で表されます、
初めて深い検索に、[X] [0] = F [Y] [0] + DIS [i]はfが存在します
yはxのサブツリー、第2の深さの探索、F [y]と[2]を算出する場合、最終的な答えは、MAXである([X] F [0 ]、[X] [2] F)
説明リンクします。https://blog.csdn.net/u011815404/article/details/82960087
#include <cstdioを> する#include <cstdlib> の#include <アルゴリズム> の#include <CStringの> 使用して 名前空間STD; INT N-; のconst int型 N = 10003 ; INT DIS [ 3。 [N]]; // サブツリー、最大距離、二番目に大きい距離 INTのTOT、ヘッド[N]。 int型の EV [N << 1 ]、EW [N << 1 ]、ENX [N << 1 ]。 無効アドオン(int型のu、int型の V、int型ワット) { EV [ ++全て】Vは、EW [すべて] = = ENX、W [すべて] =頭部[U]頭[U] = 全て、 EV [ ++すべて] = U EW [すべて] ENX [すべて] = W =頭部[V]頭[V] = 全て、 } 無効 DFS1(int型 RT、int型FA) { 用(int型 I =ヘッド[RT]; I; I = ENX [i])と { int型 NX = EV [i]は、 もし(NX == FA)続けます。 DFS1(NX、RT)。 もし(DIS [ 0 ] [NX] + EW [I]> DIS [ 0 ] [RT]) DIS [ 1 ] [RT] = DIS [ 0 ] [RT] DIS [ 0 ] [RT] = DIS [ 0 ] [NX] + [I]。 そう であれば(DIS [ 0 ] [NX] + [I]> DIS [ 1 ] [RT]) DIS [ 1 ] [RT] = DIS [ 0 ] [NX] + [I]。 } } 無効 DFS2(int型 RT、int型 FA)を// 父親の父親から自分のサブツリー最長のチェーンに加えて、ツリー全体を上がるために最大距離を、そして他の息子の父親(兄)が来ます { // 息子の更新への父 のために(int型 ; I; I = I =ヘッド[RT] ENX [I]) { int型 NX = EV [i]は、 もし(NX == FA)続けます。 もし(DIS [ 0 ] [RT] == DIS [ 0 ] [NX] + EW [i])と DIS [ 2 ] [NX] = MAX(DIS [ 1 ] [RT]、DIS [ 2 ] [RT])+ EW [I]。 他 DIS [ 2 ] [NX] = MAX(DIS [ 0 ] [RT]、DIS [ 2 ] [RT])+ EW [I]。 DFS2(NX、RT)。 } } int型のmain() { しばらく(〜のscanf(" %d個"、&n))を { memset(DIS、0、はsizeof (DIS))。 memsetの(頭、0、はsizeof (ヘッド))。= 0 ; int型NX、WW。 以下のために(int型 I = 2 ; iが<= N; iは++します) scanf関数(" %d個の%d個"、&NX、&WW)、追加(I、NX、WW)。 DFS1(1、0 ); DFS2(1、0 ); 以下のために(int型 i = 1 ; iが<= N; iは++します) printf(" %Dを\ n "、MAX(DIS [ 0 ] [i]は、DIS [ 2 ] [I]))。 } リターン 0 ; }