#include <bits/stdc++.h>
#define ll long long
using namespace std;
ll n;
vector<vector<ll>> adj;
vector<ll> a;
ll dp[100007][2][2];
void dfs(ll u, ll p) {
for (int i=0; i<2; i++){
for (int j=0; j<2; j++){
dp[u][i][j] = INT_MAX;
}
}
ll k1 = 0;
ll k2 = INT_MAX;
ll t1 = 1;
ll t2 = INT_MAX;
for (auto v : adj[u]) {
if (v==p) continue;
dfs(v,u);
ll nk1 = min(k1 + dp[v][0][0], k2 + dp[v][1][0]);
ll nk2 = min(k2 + dp[v][0][0], k1 + dp[v][1][0]);
k1 = min((ll)INT_MAX, nk1);
k2 = min((ll)INT_MAX, nk2);
ll nt1 = min(t1 + dp[v][0][1], t2 + dp[v][1][1]);
ll nt2 = min(t2 + dp[v][0][1], t1 + dp[v][1][1]);
t1 = min((ll)INT_MAX, nt1);
t2 = min((ll)INT_MAX, nt2);
}
dp[u][0][a[u]] = k1;
dp[u][0][1-a[u]] = k2;
dp[u][1][1-a[u]] = t1;
dp[u][1][a[u]] = t2;
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
cin >> n;
adj.resize(n+1);
a.resize(n+1);
for (int i=0; i<n-1; i++){
ll u,v;
cin >> u >> v;
adj[u].push_back(v);
adj[v].push_back(u);
}
for (int i=1; i<=n; i++){
cin >> a[i];
}
dfs(1,0);
ll res = min(dp[1][0][0], dp[1][1][0]);
if (res>=INT_MAX) cout << "impossible";
else cout << res;
}
| # | 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... |