#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll MOD=1e9+7;
const int N=5e5+10;
ll dp[N][4],fda[N][2],fdb[N][2],st[N];
vector<int> adj[N];
void dfs(int u,int p){
if(adj[u].size()==1){
dp[u][0]=st[u]?1e9:0;
dp[u][1]=st[u]?0:1e9;
dp[u][2]=st[u]?1:1e9;
dp[u][3]=st[u]?1e9:1;
return;
}
int cnt=0;
vector<int> c;
c.push_back(0);
for(auto v:adj[u]){
if(v==p) continue;
dfs(v,u);
cnt++;
c.push_back(v);
}
//calculate dp[u][i]
fda[0][1]=1e9,fdb[0][1]=1e9;
for(int i=1;i<=cnt;i++){
fda[i][0]=min(fda[i-1][0]+dp[c[i]][0],fda[i-1][1]+dp[c[i]][2]);
fda[i][1]=min(fda[i-1][0]+dp[c[i]][2],fda[i-1][1]+dp[c[i]][0]);
fdb[i][0]=min(fdb[i-1][0]+dp[c[i]][1],fdb[i-1][1]+dp[c[i]][3]);
fdb[i][1]=min(fdb[i-1][0]+dp[c[i]][3],fdb[i-1][1]+dp[c[i]][1]);
}
dp[u][0]=st[u]?fda[cnt][1]:fda[cnt][0];
dp[u][1]=st[u]?fda[cnt][0]:fda[cnt][1];
dp[u][2]=st[u]?fdb[cnt][0]+1LL:fdb[cnt][1]+1LL;
dp[u][3]=st[u]?fdb[cnt][1]+1LL:fdb[cnt][0]+1LL;
}
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
int n;
cin>>n;
int rt=-1;
for(int i=0;i<n-1;i++){
int u,v;
cin>>u >>v;
adj[u].push_back(v);
adj[v].push_back(u);
}
for(int i=1;i<=n;i++) cin>>st[i];
for(int i=1;i<=n;i++){
if(adj[i].size()>=2){
rt=i;
break;
}
}
dfs(rt,rt);
// cout<<rt <<"\n";
// for(int i=1;i<=n;i++){
// cout<<i <<"\n";
// for(int j=0;j<4;j++) cout<<dp[i][j] <<" ";
// cout<<"\n";
// }
ll ans=min(dp[rt][0],dp[rt][2]);
if(ans>=1e9) cout<<"impossible";
else 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... |