#include <bits/stdc++.h>
using namespace std;
#define sz(v) (int) v.size()
#define pb push_back
#define popcount(x) __builtin_popcount(x)
using i64 = long long;
template<typename T>
using vec = vector<T>;
template<typename T>
void chmin(T &a,T b){ a = min(a,b); }
int n;
vec<vec<int>> adj;
vec<int> col;
i64 dp[100100][2][2];
void dfs(int node,int p){
if (sz(adj[node]) == 1 && p != -1){
dp[node][col[node]][0] = 0;
dp[node][(col[node] + 1) % 2][1] = 1;
return;
}
for (auto x : adj[node]){
if (x == p) continue;
dfs(x,node);
}
for (int mask = 0; mask < (1 << sz(adj[node])); mask++){
i64 ans1 = 0,ans2 = 0;
int cnt = 0;
for (int x = 0; x < sz(adj[node]); x++){
if (adj[node][x] == p) continue;
if (mask & (1 << x)){
cnt++;
ans1 += dp[adj[node][x]][0][1];
ans2 += dp[adj[node][x]][1][1];
}
else {
ans1 += dp[adj[node][x]][0][0];
ans2 += dp[adj[node][x]][1][0];
}
}
if (cnt & 1){
chmin(dp[node][(col[node]+1) % 2][0],ans1);
chmin(dp[node][col[node]][1],ans2 + 1);
}
else {
chmin(dp[node][col[node]][0],ans1);
chmin(dp[node][(col[node]+1) % 2][1],ans2 + 1);
}
}
}
int main(){
ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);
cin >> n;
adj.assign(n,vec<int>());
col.assign(n,0);
for (int i = 0; i < n-1; i++){
int u,v; cin >> u >> v;
u--; v--;
adj[u].pb(v);
adj[v].pb(u);
}
for (int i = 0; i < n; i++) cin >> col[i];
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] = INT_MAX;
}
}
}
dfs(0,-1);
i64 ans = min(dp[0][0][0],dp[0][0][1]);
if (ans == INT_MAX) cout << "impossible" << endl;
else cout << ans << endl;
return 0;
}
| # | 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... |