#include <bits/stdc++.h>
#define int long long
signed main() {
std::ios::sync_with_stdio(false);
std::cin.tie(0);
int n;
std::cin >> n;
std::vector<int> adj[n + 1];
for(int i = 1; i < n; i++) {
int u, v;
std::cin >> u >> v;
adj[u].push_back(v);
adj[v].push_back(u);
}
std::vector<int> a(n + 1);
for(int i = 1; i <= n; i++) {
std::cin >> a[i];
}
std::function<int(std::vector<int>, std::vector<int>, int)> Solve = [] (std::vector<int> a, std::vector<int> b, int t) {
int n = a.size();
std::vector<std::vector<int>> dp(n + 1, std::vector<int>(2, 1e18));
dp[0][1] = a[0];
dp[0][0] = b[0];
for(int i = 1; i < n; i++) {
for(int mod = 0; mod < 2; mod++) {
dp[i][mod] = std::min(dp[i - 1][mod ^ 1] + a[i], dp[i - 1][mod] + b[i]);
}
}
return dp[n - 1][t];
};
int dp[n + 1][2][2];
for(int i = 0; i <= n; i++) {
for(int j = 0; j < 2; j++) {
for(int k = 0; k < 2; k++) {
dp[i][j][k] = n + 1;
}
}
}
std::function<void(int, int)> dfs = [&] (int v, int p) {
for(auto u : adj[v]) {
if(u != p) {
dfs(u, v);
}
}
if(adj[v].size() == 1 && v != 1) {
dp[v][0][a[v]] = 0;
dp[v][1][a[v] ^ 1] = 1;
return;
}
std::vector<int> child;
for(auto u : adj[v]) {
if(u != p) {
child.push_back(u);
}
}
std::vector<int> c, d;
for(int t = 0; t < 2; t++) {
for(int is = 0; is < 2; is++) {
if(t != a[v] && is == 0) {
for(int i = 0; i < child.size(); i++) {
int ch = child[i];
c.push_back(dp[ch][1][0]);
d.push_back(dp[ch][0][0]);
}
dp[v][is][t] = Solve(c, d, 1) + is;
c.clear();
d.clear();
}
else if(t != a[v] && is == 1) {
for(int i = 0; i < child.size(); i++) {
int ch = child[i];
c.push_back(dp[ch][1][1]);
d.push_back(dp[ch][0][1]);
}
dp[v][is][t] = Solve(c, d, 0) + is;
c.clear();
d.clear();
}
else if(t == a[v] && is == 0) {
for(int i = 0; i < child.size(); i++) {
int ch = child[i];
c.push_back(dp[ch][1][0]);
d.push_back(dp[ch][0][0]);
}
dp[v][is][t] = Solve(c, d, 0) + is;
c.clear();
d.clear();
}
else {
for(int i = 0; i < child.size(); i++) {
int ch = child[i];
c.push_back(dp[ch][1][1]);
d.push_back(dp[ch][0][1]);
}
dp[v][is][t] = Solve(c, d, 1) + is;
c.clear();
d.clear();
}
}
}
};
dfs(1, 0);
int ans = std::min(dp[1][0][0], dp[1][1][0]);
if(ans > n) {
std::cout << "impossible";
}
else {
std::cout << ans;
}
}
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |