同 POJ 2342,但數據範圍 N ≤ 6000,測試用例多,vector 可能 TLE。需用**靜態鏈式前向星**存圖,遞歸 DFS 並注意棧大小。
struct Edge { int to, next; } e[MAXN * 2];
int head[MAXN], ecnt;
void addEdge(int u, int v) {
e[ecnt] = {v, head[u]};
head[u] = ecnt++;
}
#include
#include
#include
using namespace std;
const int MAXN = 6005;
struct Edge { int to, next; } e[MAXN * 2];
int head[MAXN], ecnt;
int dp[MAXN][2], val[MAXN];
bool hasFather[MAXN];
int n, root;
void addEdge(int u, int v) {
e[ecnt] = {v, head[u]};
head[u] = ecnt++;
}
void dfs(int u) {
dp[u][1] = val[u];
dp[u][0] = 0;
for (int i = head[u]; ~i; i = e[i].next) {
int v = e[i].to;
dfs(v);
dp[u][1] += dp[v][0];
dp[u][0] += max(dp[v][0], dp[v][1]);
}
}
int main() {
while (~scanf("%d", &n)) {
ecnt = 0;
memset(head, -1, sizeof(head));
memset(hasFather, 0, sizeof(hasFather));
for (int i = 1; i <= n; i++) scanf("%d", &val[i]);
for (int i = 0; i < n-1; i++) {
int L, K; scanf("%d%d", &L, &K);
addEdge(K, L); // K 是上司
hasFather[L] = true;
}
root = 1;
while (hasFather[root]) root++;
dfs(root);
printf("%d\n", max(dp[root][0], dp[root][1]));
}
return 0;
}
| 特性 | POJ 2342 | HDU 1520 |
|---|---|---|
| 存圖 | vector 可過 | 需靜態鏈表 |
| 時間限制 | 較寬 | 較嚴 |
| 核心算法 | 完全相同 | 完全相同 |