#include <bits/stdc++.h>
#define ll long long
#define ld long double
#define all(v) begin(v), end(v)
#define pi pair<int, int>
#define vi vector<int>
using namespace std;
mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());
const int N = 1e5+3;
int n;
vector<int> g[N];
bool st[N];
ll dp[N][2][2]; //(current bulb #, bulb off/on, switch off/on)
ll tp[2][2]; //temp dp
ll INF = 1e9+7;
void dfs(int u, int p){
for(auto v:g[u]){
if(v!=p) dfs(v, u);
}
if(st[u] == 0){
dp[u][1][1] = 1;
dp[u][1][0] = INF;
dp[u][0][1] = INF;
}
else{
dp[u][0][1] = 1;
dp[u][0][0] = INF;
dp[u][1][1] = INF;
}
for(auto v:g[u]){
if(v==p)continue;
for(int i = 0; i < 2; i++)
for(int j = 0; j < 2; j++) tp[i][j] = INF;
for(int s1 = 0; s1 < 2; s1++){
for(int t1 = 0; t1 < 2; t1++){
for(int s2 = 0; s2 < 2; s2++){
for(int t2 = 0; t2 < 2; t2++){
if((s2 ^ t1) != 0) continue;
tp[s1^t2][t1] = min(tp[s1^t2][t1], dp[u][s1][t1] + dp[v][s2][t2]);
}
}
}
}
swap(dp[u], tp);
}
}
int main(){
ios_base::sync_with_stdio(0); cin.tie(0);
cin >> n;
for(int i = 1; i < n; i++){
int u, v; cin >> u >> v;
g[u].push_back(v);
g[v].push_back(u);
}
for(int i = 1; i <= n; i++) cin >> st[i];
dfs(1, 0);
// for(int i = 1; i <= n; i++){
// cout << i << "\n";
// for(int s = 0; s < 2; s++){
// for(int t = 0; t < 2; t++){
// cout << (dp[i][s][t] >= 1e9? -1:dp[i][s][t]) << " ";
// }
// cout << "\n";
// }
// cout << "\n";
// }
cout << (min(dp[1][0][0], dp[1][0][1])>=INF?"impossible":to_string(min(dp[1][0][0], dp[1][0][1])));
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... |