それは「暴力的なカップ」であることから、その後、暴力の解決策を取ります。
私達はちょうど細かい点から再帰的に上がりました
無根木は根と木を回す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(1、0 ); 55 のprintf(" %のLLD \ n " 、ANS)。 56 リターン 0 。 57 }