ツリーのテンプレートのタイトルの直径
我々はDFSたら、このチャート(木)に描画維持した後、SUM1は、現在のノードからの最長パスを行くために彼の息子に語った定義は何回の長いパスを示しSUM2、数あります。私たちはまず、現在のノードのSUM2更新のノードへの電流経路+ SUM1電流経路の時間長、更新がSUM1より大きいSUM2場合、我々はそれらの値を交換し、これは私たちに、計算が完了した後、右を見つけることは難しいことではありませんでANS答えは(SUM1 + SUM2)最大で後のように、現在のノードの父は、彼のSUM1に戻って、このアルゴリズムは、したがって、時間の複雑さはO(n)は、再度、各ポイントを通過します。
1の#include <iostreamの> 2の#include <cstdioを> 3の#include <CStringの> 4の#include <アルゴリズム> 5 使って 名前空間STD。 6のtypedef 長い 長LL。 7 int型N、M。 8 構造体の縁{ 9 INT 次に、DIS。 10 } [ 100010 << 1 ]。 11 のint NUM、ヘッド[ 100010 << 1 ]。 12 のint F [ 100010 ]、ANS。 13 のボイド(追加INT から、INTにINT {DIS) 14 [++ NUM] .next =ヘッドから]。 15 [NUM] = .TO に、 16 [NUM] .DISの=のDIS。 17 ヘッド【から】= NUM。 18 } 19 INT DFS(INT U、INT FA){ 20 のint SUM1 = 0、SUM2 = 0 。 21 のために(int型 I =ヘッドは、[U]; I;私は= [I] .next) 22 場合![I] .TOを(=FA){ 23 SUM2 = MAX(SUM2、DFS([I] .TO、U)+ [I] .DIS)。 24 であれば(SUM2> SUM1)スワップ(SUM1、SUM2)。 25の ANS = MAX(ANS、SUM1 + SUM2)。 26 } 27 リターンSUM1。 28 } 29 INT メイン(){ 30 のscanf(" %D%dの"、&N、&M)。 31 のために(int型 I = 1 ; I <= M Iは++ ){ 32 チャーC。 33 INT X、Y、Z。 34 CIN >> X >> Y >> Z >>C; 35 追加(X、Y、Z)。 36 追加(X、Y、Z)。 37 } 38の DFS(1、0 ); 39 のprintf(" %d個の\ n " 、ANS)。 40 リターン 0 ; 41 }