| # | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
|---|---|---|---|---|---|---|---|
| 1283383 | am_aadvik | Power Plant (JOI20_power) | C++20 | 0 ms | 0 KiB |
#include <iostream>
#include <vector>
#include <cstring>
using namespace std;
vector<int> g[2000005], p;
int dp[2000005][2];
int dfs(int node, int b, int par) {
if (dp[node][b] != -1) return dp[node][b];
int mc1 = 0, mc0 = 0, sc1 = 0;
for (auto x : g[node])
if (x != par) {
mc1 = max(mc1, dfs(x, 1, node));
sc1 += dfs(x, 1, node);
mc0 = max(mc0, dfs(x, 0, node));
}
int c1 = ((b == 0) ? mc1 : 0) + p[node];
int c2 = ((b == 0) ? mc0 : 0);
int c3 = ((b == 0) ? max(sc1, mc0) : sc1) - p[node];
return dp[node][b] = max({ c1, c2, c3 });
}
int main() {
ios_base::sync_with_stdio(false); cin.tie(NULL);
int n; cin >> n; p.assign(n + 1, 0);
for (int i = 1; i < n; ++i) {
int u, v; cin >> u >> v;
g[u].push_back(v);
g[v].push_back(u);
}
string s; cin >> s;
for (int i = 1; i <= n; ++i)
p[i] = (s[i - 1] - '0');
memset(dp, -1, sizeof(dp));
cout << dfs(1, 0, 0) << '\n';
}
