[ブルーブリッジカップ2015予選]生命の木は、

 

 

それは「暴力的なカップ」であることから、その後、暴力の解決策を取ります。

私達はちょうど細かい点から再帰的に上がりました

無根木は根と木を回すDFS、再帰的な検索最高。注LLオープン

 

1の#include <iostreamの>
 2の#include <アルゴリズム>
 3の#include < ストリング >
 4の#include < 文字列・H>
 5の#include <ベクトル>
 6の#include <マップ>
 7の#include <積層>
 8の#include < セット >
 9の#include <キュー>
 10の#include <math.h>の
 11の#include <cstdioを>
 12の#include <iomanip>
 13の#include <TIME.H>
14  
15  の#define LL長い長い
 16  の#define INF 0x3f3f3f3f
 17 #define LSのNOD << 1個の
 18  の#define RS(NOD << 1)+1
 19  
20  CONST  INT MAXN = 1E5 + 10 21  CONST LL MOD = 20010905 22  
23のstd ::ベクトル<LL> ツリー[MAXN]。
24  [MAXN]、WW [MAXN]、ANS W LL。
25の 
26  ボイド DFS(intは U、int型の父){
 27      INT LEN = ツリー[U] .size()。
28      WW [U] = W [U]。
29      のためのint型私は= 0を I <LEN; I ++){
 30          のint V = ツリー[U] [I]。
31          であれば(!V = {父)
 32              DFS(V、U)。
33              であれば(WW [V]> 0 34                  WW [U] + = WW [V]。
35          }
 36      }
 37      であれば(WW [U]> ANS)
 38          ANS = WW [U]。
39  }
 40  
41  int型のmain(){
 42      INT N。
43      のscanf(" %d個"、&N)
44     以下のためにINT iが= 1 ; I <= N; I ++ ){
 45          のscanf(" %のLLD "、&W [I])。
46      }
 47      のためにINT iは= 1 ; iが<= N- 1、I ++ ){
 48          INT U、V。
49          のscanf(" %D%D "、&​​U、およびV)。
50          ツリー[U] .push_back(V)。
51          ツリー[V] .push_back(U)。
52      }
 53の      ANS = 0 54     DFS(10 );
55      のprintf(" %のLLD \ n " 、ANS)。
56      リターン 0 57 }

おすすめ

転載: www.cnblogs.com/-Ackerman/p/12228400.html