タイトルリンク:http : //acm.hdu.edu.cn/showproblem.php?pid=1520
一般的な考え方は、メンバーシップツリーを与えることです。各人はノードを表し、各ノードには値があり、親子関係を持つポイントのペアを1つだけ選択して、重みの合計を最大化する方法を尋ねます。
コードは次のとおりです。
1 #include <bits / stdc ++。h> 2 名前空間std を使用 。 3 typedef unsigned int ui; 4 typedef long long ll; 5 typedef unsigned long long ull; 6 #define pf printf 7 #define mem(a、b)memset(a、b、sizeof(a)) 8 #define prime1 1e9 + 7 9 #define prime2 1e9 + 9 10 #define pi 3.14159265 11 #define lson l、 mid、rt << 1 12 #define rson mid + 1、r、rt << 1 | 1 13 #define scand(x)scanf( "%llf"、&x) 14 #define f(i、a、b)for(int i = a; i <= b; i ++) 15 #define scan(a)scanf( "%d"、&a) 16 #define mp(a、b)make_pair((a)、(b)) 17 #define Pペア<int、int> 18 #define dbg(args)cout <<#args << ":" << args << endl; 19 #define inf 0x7ffffff 20 inline int read(){ 21 int ans = 0、w = 1 ; 22 文字 ch = getchar(); 23 間(!(ch == ' - ')w = -1 ; ch = getchar();) 24 while(isdigit(ch))ans =(ans << 3)+(ans << 1)+ ch- ' 0 '、 ch = getchar(); 25 return ans * w; 26 } 27 int n、m、t; 28 const int maxn = 1e4 + 10 ; 29 int value [maxn]; 30 int dp [maxn] [ 2 ]; // 0この時点で選択されていない最大重量合計を示し、1はこの時点で選択されている最大重量合計を示し、 31ベクトル< int> G [maxn]; 32 int f [maxn]; // fの設定はルートノードを検索する 33 void dfs(int u) 34 { 35 dp [u] [ 0 ] = 0 ; 36 dp [u] [ 1 ] =値[U]; // 両方の場合に参加し、初期値設定に参加していない 37 のために(INT I = 0 ; I <G [U] .size(); I ++ ) 38である { 39 INTソン= G [U] [i]; 40 dfs(息子); // DFS 41 dp [u] [ 0] + = max(dp [son] [ 1 ]、dp [son] [ 0 ]); // 親ノードを選択しないと、子ノードを選択できるかどうかが 決まります。42 dp [u] [ 1 ] + = dp [son] [ 0 ]; // 親ノードが選択された後、子ノードは 43 } 44 } 45 int main() 46 { 47 // freopen( "input.txt"、 "r"、stdin); 48 // freopen( " のみを選択できます output.txt "、" w "、stdout); 49 std :: ios :: sync_with_stdio(false ); 50 while(〜scanf(" %d "、&n)) 51 { 52 f(i、1 、n) 53 { 54 scanf(" %d "、&value [i]); 55 G [i] .clear(); 56 f [i] = -1 ; 57 } 58 while(1 ) 59 { 60 int a、b; 61 scanf(" %d%d "、&a、&b); 62 if(a == 0 && b == 0)ブレーク; 63 G [b] .push_back(a); 64 f [a] = b; 65 } 66 int t = 1 ; 67 while(f [t]!=- 1 ) 68 { 69 t = f [t]; 70 } 71 dfs(t); 72 printf(" %d \ n "、max(dp [t] [ 0 ]、dp [t] [ 1 ])); 73 } 74 }