-
Notifications
You must be signed in to change notification settings - Fork 0
/
hdoj1520.cpp
68 lines (62 loc) · 1.58 KB
/
hdoj1520.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
//
// Created by zhu on 2018/3/7.
//
/*
* 简单树状DP
* 树状DP就是将DP放在树上
* 一般是从底部算起,最终状态放在根上
* 其他的普通DP差不多,一般会用到DFS
* */
#include <iostream>
#include <vector>
#include <fstream>
using namespace std;
const int maxN = 6005;
struct Staff {
int father = -1;
vector<int> son;
int point;
};
Staff staffs[maxN];
int dp[maxN][2]; //dp[i][j]表示第i个人来或不来(1/0)时最大的活跃因子
void dfs(int root) {
if (staffs[root].son.empty()) {
dp[root][0] = 0;
dp[root][1] = staffs[root].point;
return;
}
for (const auto &item :staffs[root].son) {
dfs(item);
}
dp[root][0] = 0;
dp[root][1] = staffs[root].point;
for (const auto &item :staffs[root].son) {
dp[root][0] += max(dp[item][0], dp[item][1]);
dp[root][1] += dp[item][0];
}
}
int main() {
// fstream is("data.dat");
int N;
while (cin >> N && N) {
for (int i = 1; i <= N; i++) {
staffs[i].father = -1;
staffs[i].son.clear();
cin >> staffs[i].point;
}
int temFather, temSon;
while (cin >> temSon >> temFather && (temSon + temFather) != 0) {
staffs[temFather].son.push_back(temSon);
staffs[temSon].father = temFather;
}
int root;
for (root = 1; root <= N; root++) {
if (staffs[root].father == -1) {
break;
}
}
dfs(root);
cout << max(dp[root][0], dp[root][1])<<endl;
}
return 0;
}