http://poj.org/problem?id=2342
質問の意味:パーティーに、そこの従業員を、N、N- 1をされている従属関係にあっても木のように、各従業員が幸せな値が負になることができている、従業員のパーティーならば、彼は直接の上司に行くことができませんパーティーで人、総幸福の最大数の究極の値を求める当事者。
溶液:DP DFSた[0]プラスパーティ、サブツリーのルートノードの最大値、すなわち、Y DPのすべての息子[Y]からx [1] [x]はツリーのルートを見つけます直接部下彼は参加できない場合はアップ、参加をX; DPは、[X] [0]×パーティを見送る、その後、彼は直接レポートを行くことができない、彼の息子最大蓄積状態を表し、すなわち、最大(DP [Y] [0]、DP [Y] [1]);参加息子幸せ考慮しない場合は0よりも大きい場合、0は、MAX [0] DP [x]は[0]ないように、DPう[Y]を取る未満でありますこれは、ゼロよりも少なくなります。
書式#include <stdio.hに> する#include <iostreamの> の#include <アルゴリズム> 書式#include <CStringの> 書式#include <math.h>の 書式#include < 文字列 > の#include <マップ> 書式#include <キュー> の#include <スタック> #含ま < 設定 > の#defineは長い長いっ の#define 0x3f3f3f3f INF 使用して 名前空間はstdを、 int型のn; ベクトル < 整数 >息子[ 6005 ]; INT DP [ 6005 ] [ 2 ]。 BOOL VIS [ 6005 ]; ボイド DFS(int型X) { ため(int型 i = 0 ; I <息子[X] .size(); iは++ ) { int型、Y = 息子[X] [I]; DFS(Y)。 DP [X] [ 0 ] + = MAX(DP [Y] [ 1 ]、DP [Y] [ 0 ])。 DP [X] [ 1 ] + = DP [Y] [ 0 ]。 } } int型のmain() { 一方(scanf関数(" %のD "、&N)!= EOF) { memsetの(DP、0、はsizeof (DP)); のmemset(VIS、falseに、はsizeof (VIS)); のための(INT I = 1 ; I <= N; I ++の) scanfの(" %Dを"&DP [I] [ 1。)]; /// 初期DP [i]は[1]私はパーティに幸福値を表す 整数K、L; のため(int型 iは= 1 ; iがN- <I ++は) { scanfの(" %のD%のD "、&L、&K ); 息子[K] .push_back(L); VIS [L] =真 ; /// Uは上司有 } のscanf(" %dの%のD "、&L、&k)を、 用(int型 iは= 1 ; iが<= N; iが++ ) { 場合(!//找到根节点VIS [I]) { DFS(I)。 printf(" %Dを\ n "、MAX(DP [I] [ 0 ]、DP [I] [ 1 ]))。 破ります; } } } 戻り 0 。 }