イタリア+ソリューションいます:
1 // 。5 2 // 1 。3 // 2 1 。4 // 。3 1 。5 // 1 。6 // (i行と呼ぶ)下5行目に第二行目から5点を割り当て、各行2つの数X、Y。それがiとXとの間にエッジがあることを示します。これは、y軸の1辺の長さである 7 // あなたは離れてすべてのポイントと各ポイントの最大値を見つける必要があります。そして、最終的な出力インチ 8 // これは私が言うのですか、なぜ木、あることに注意してください。あなただけのn-1のエッジ、及び各点は、少なくとも一つのエッジ有するため、 9 10 // ので、他の点からのランダム点x距離からBFSで見つけることができます。ここで、xと、最大距離X1のポイントを見つけ、その後、彼は再び実行するために行ってきましたがBFS 11 // 離れた最大の点X2から、この点X1から見つけるを。ピットインは再びBFS。彼らはそれからの最大出力を見てみましょう 12 // 13 // あなたはその点を見つける最初の時間は確かに最も深いリーフノード×1マップであるため。肯定の全ての点から、最大距離の他のポイントをこのX1を使用する他のリーフノード×2をお探し 14 // これら2点の間。。これら二つの点ための最大深さ 15の#include <stdio.hの> 16の#include < 文字列 .H> 17の#include <iostreamの> 18であるの#include <アルゴリズム> 19。の#include <キュー> 20である、 使用 名前空間STD; 21である CONST INT MAXN = 20010. ; 22である INT ; deap1 [MAXN]、VIS [MAXN]、deap2は[MAXN]、N- [MAXN] deap3、CNT、ヘッド[MAXN] 23であるキュー< INT > R&LT; 24 構造体のエッジ 25 { 26が INT U、V、次に、W; 27 } E [MAXN]。 28 ボイドのinit(INT DEAP [MAXN]) 29 { 30 のための(int型 i = 1 ; iが<= N; ++ I) 31 DEAP [I] = 0 。 32 } 33 空隙 add_edge(int型のx、int型の Y、int型Z) 34 { 35 E [CNT] .U =のX。 36 E [CNT] .V = Y。 37 E [CNT] .W = Z。 38 E [CNT] .next = 頭部[X]。 39 頭[X] = CNT ++; 40 } 41の 空隙 BFS(int型のx、int型DEAP [MAXN]) 42 { 43 ながら(!r.empty())r.pop(); 44の INIT(VIS)。 45 VIS [X] = 1 。 46 r.push(X)。 47 ながら(!r.empty()) 48 { 49 INT U = r.front()。 50 r.pop()。 51 のために(int型 - ;!I = I =ヘッド[U] 1 ; I = E [I] .next) 52 { 53 INTは V = E [I] .V。 54 であれば(!VIS [V]) 55 { 56 VIS [V] = 1 。 57 DEAP [V] DEAP [U] + = Eを[I] .W。 58 r.push(V)。 59 } 60 } 61 } 62 } 63 のint main()の 64 { 65 ながら(〜のscanf(" %d個"、&N)) 66 { 67 のmemset(頭、 -1、はsizeof (ヘッド))。 68 CNT = 0 。 69 のために(int型 I = 2 ; iが<= N; ++ I) 70 { 71 のint X、Yと、 72 のscanf(" %D%dの"、およびX&Y)。 73 add_edge(I、x、y)は、 74 add_edge(X、I、Y)。 75 } 76 INIT(deap1)。 77の BFS(1 、deap1)。 78 INT ANS1 = 0、ID1 = -1 ; // printfの( "** \ nを"); 79 のために(int型 i = 1 ; iが<= N; ++ I) 80 { 81の 場合(ANS1 < deap1 [I]) 82 { 83 ANS1 = deap1 [I]。 84 ID1 = I。 85 } 86 } 87 INIT(deap2)。 88 であれば(ID1 =! - 1 ) 89 { 90 BFS(ID1、deap2)。 91 } 92 ANS1 = 0、ID1 = - 1 。 93 のために(int型 i = 1 ; iが<= N; ++ I) 94 { 95の 場合(ANS1 < deap2 [I]) 96 { 97 ANS1 = deap2 [I]。 98 ID1 = I。 99 } 100 } 101 INIT(deap3)。 102 であれば(ID1 =! - 1 ) 103 { 104の BFS(ID1、deap3)。 105 } 106 のためには、(int型 i = 1 ; iは= N <; ++ I) 107 { 108 のprintf(" %Dを\ n " 、MAX(deap1 [i]は、MAX(deap2 [I]、deap3 [I]))) ; 109 } 110 } 111 戻り 0 ; 112 }