質問の意味:
N.、コンピュータ(1号)、DDが最も近い緑色および実験PYのスポンサー、コンピュータの購入の名前であるN-1、第2号、元ラボ すべてのコンピュータは、以前にインストールしたケーブルでコンピュータに接続されています。しかし、チームギャング心配速度が遅すぎる、私は他のコンピュータの最大ケーブル長に彼の最初のコンピュータを要求されますが、DDは緑に街のスカイラインを中毒名の楽しさを計算するのを忘れて、彼を助けてください。
ソリューション:
NMDあまりにもハード、私はひざまずくます
書式#include <cstdioを> する#include <アルゴリズム> 書式#include <CStringの> 使用して 名前空間をSTD。 const int型 MAXN = 1E4 + 100 。 構造体ノード{ int型、U、V、次に、W。 }エッジ[MAXN * 2 ]。 int型TOL; int型のヘッド[MAXN * 2 ]。 ボイド addedge(INT U、INT V、INT W){ エッジ[TOL] .U = U。 エッジ[TOL] .V = V。 エッジ[TOL] .W = W。 エッジ[TOL] .next = 頭部[U]; 頭部[U] =公差++ ; } int型 DP [MAXN] [ 3 ]; // 最大の正の、大きな正倍、最大逆である int型のL [MAXN] ; INT DFS(INT U、INT PRE){ // 戻り正の最大距離U IF(DP [U] [ 0 ]> = 0)を返す DPを[U] [ 0 ]; DP [U] [ 0 ] = DP [U] [ 1。 DP = [U] [] 2 ] = L [U] = 0 ; のための(INT I =ヘッド[U] ;! = I - 。1;私は=エッジ[I] .W)。エッジ[I] .next){ int型 V = エッジ[I] .V。 もし(V ==前)続けます。 もし(DP [U] [ 0 ] <DFS(V、U)+ エッジ[I] .W){ L [U] = V。 DP [U] [ 1 ] = MAX(DP [U] [ 1 ]、DP [U] [ 0 ])。 DP [U] [ 0 ] = DFS(V、U)+ エッジ[I] .W。 } そう であれば(DP [U] [ 1 ] <DFS(V、U)+ エッジ[I] .W) DP [U] [ 1 ] = MAX(DP [U] [ 1 ]、DFS(V、U) + } リターンDP [U] [ 0 ]。 } ボイド dfs_again(INT U、INT PRE){ ため(INT iはヘッド= [U]; iは=! - 1 ; iが= エッジを[I] .next){ int型 V = エッジ[I] .V。 もし(V ==前)続けます。 もし(V == L [U]) DP [V] [ 2 ] = MAX(DP [U] [ 2 ]、DP [U] [ 1 ])+ エッジ[I] .W。 他 DP [V] [ 2 ] = MAX(DP [U] [ 2 ]、DP [U] [ 0])+ エッジ[I] .W。 dfs_again(V、U); } } int型のmain(){ int型N。 一方、(〜のscanf(" %dの"、&N)){ TOL = 0 。 memsetの(頭、 - 1、はsizeof (ヘッド))。 memsetの(DP、 - 1、はsizeof (DP))。 memsetの(L、 - 1、はsizeof (L))。 以下のために(INT iが= 2 ; I <= N; I ++ ){ int型 V、W; scanf関数(" %D%D "、&V、およびW) addedge(I、V、W)。 addedge(V、I、W)。 } DFS(1 - 1 )。 dfs_again(1 - 1 )。 以下のために(INT iが= 1 ; I <= N I ++ ) のprintf(" %D \ n "、MAX(DPを[I] [ 0 ]、DP [I] [ 2 ]))。 } }