HDU2196コンピュータ(クラシックツリー-DP)

質問の意味:

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 ]))。
    } 
}

 

おすすめ

転載: www.cnblogs.com/zhanglichen/p/12639679.html