社区讨论
30pts 求调
P1352没有上司的舞会参与者 3已保存回复 4
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 4 条
- 当前快照
- 1 份
- 快照标识符
- @mifq37mx
- 此快照首次捕获于
- 2025/11/26 16:08 3 个月前
- 此快照最后确认于
- 2025/11/26 17:29 3 个月前
CPP
#include<bits/stdc++.h>
using namespace std ;
const int maxn = 6e3 + 5;
vector<int> g[maxn];
int a[maxn];
int dp[maxn][2];
int n;
bool vis[maxn];
bool vis2[maxn][2];
int dfs (int u, bool k, int fa) { // k 开关
if (vis2[u][k]) {
return dp[u][k];
}
if (k) {
dp[u][k] = a[u];
for (int i = 0; i < g[u].size(); i++) {
int v = g[u][i];
if (v == fa) continue;
k = !k;
dp[u][k] += dfs(v, k, u);
k = !k;
}
}
else {
for (int i = 0; i < g[u].size(); i++) {
int v = g[u][i];
if (v == fa) continue;
k = !k;
int tmp1 = dfs(v, k, u);
k = !k;
int tmp2 = dfs(v, k, u);
dp[u][k] += max(tmp1, tmp2);
}
}
vis2[u][k] = 1;
return dp[u][k];
}
int main () {
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
for (int i = 1; i < n; i++) {
int u, v;
cin >> u >> v;
g[u].push_back(v);
g[v].push_back(u);
vis[u] = 1;
}
int pt = 0;
for (int i = 1; i <= n; i++) {
if (!vis[i]) {
pt = i;
break;
}
}
cout << max(dfs(pt, 0, -1), dfs(pt, 1, -1));
return 0;
}
回复
共 4 条回复,欢迎继续交流。
正在加载回复...