トピックリンクします。https://vjudge.net/problem/HDU-1520
質問の意味:その道路と同じタイトルのいないパーティーボスは、木の少し右を与えluogu、親ノードと子ノードは、重量と最大で、あなたは最高を求めることができるように選択した方法を聞いて、選択することはできません。
アイデア:肝臓は最近QAQは、来る開始するために基本的な質問から、木のDPを開始しました!
DPで[U] [0] Uは、ノードが選択されていない、DP [U]を表す[1]が選択される基を表し、VIは、次いで、ノードuの子ノードです。
DP [U] [0] = SUM(MAX(DP [我々] [0]、DP [我々] [1]))
DP [U] [1] = valの[U] + SUM(DP [VI] [0])
一度OK DFS、結果が最大(DP [ルート] [0]、DP [ルート] [1])、自分の道をルートです。
ACコード:
書式#include <cstdioを> する#include <アルゴリズム> 使用して 名前空間はstdを、 const int型 MAXN = 6005 ; int型 N、CNT、ヘッド[MAXN]、ヴァル[MAXN]、indeg [MAXN]、DP [MAXN] [ 2 ]。 構造体ノード{ int型V、NEX。 }エッジ[MAXN]。 ボイド ADDE(INT U、INT V){ エッジ[ ++ CNT] .V = V。 エッジ[CNT] .nex = 頭部[U]。 ヘッド[U] = CNT。 } ボイド DFS(INT U){ DP [U] [ 1 ] =ヴァル[U]。 以下のために(int型 ; I I = I =ヘッド[U] {エッジ[I] .nex) のint V = エッジ[I] .V。 DFS(V); DP [U] [ 0 ] + = MAX(DP [V] [ 0 ]、DP [V] [ 1 ])。 DP [U] [ 1 ] + = DP [V] [ 0 ]。 } } int型のmain(){ ながら(〜のscanf(" %d個"、&N)){ CNT = 0 。 以下のために(int型私= 1 ; iが<= N; ++ I){ scanf関数(" %のD "、およびヴァル[I])。 ヘッド[I] = 0、indeg [I] = 0、DP [i]が[ 0 ] = 0 。 } int型、B。 一方、(scanf関数(" %D%dの"、&、&B)、&& B){ indeg [A] = 1 。 ADDE(B、A)。 } int型のルート; 以下のために(int型 I = 1 ; I <= N; ++ I)の 場合(!indeg [I]){ ルート =私; 破ります; } DFS(ルート)。 printf(" %Dを\ n "、MAX(DP [ルート] [ 0 ]、DP [ルート] [ 1 ]))。 } 戻り 0 。 }