【POJ1985】牛マラソン

ツリーのテンプレートのタイトルの直径

我々は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  からINTINT {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(10 );
39      のprintf(" %d個の\ n " 、ANS)。
40      リターン 0 ;
41 }
ACコード

 

おすすめ

転載: www.cnblogs.com/shl-blog/p/10960990.html