#include <bits/stdc++.h>
#define int long long
#define sz(a) (int)a.size()
#define all(a) a.begin(), a.end()
using namespace std;
int n;
vector<int> on;
vector<vector<int>> neigh;
vector<vector<int>> child;
vector<vector<vector<int>>> memo;
void make_tree(int x, int p){
for (auto u : neigh[x])
{
if(u==p) continue;
make_tree(u,x);
child[x].push_back(u);
}
}
int dp(int x, bool sta, bool tog){
if(on[x]) sta=!sta;
if(memo[x][sta][tog]!=-1) return memo[x][sta][tog];
vector<pair<int,int>> val(sz(child[x]));
vector<int> df(sz(child[x]));
int sm=0;
for (int i = 0; i < sz(child[x]); i++)
{
int u=child[x][i];
val[i]={dp(u,tog,false), dp(u,tog,true)};
df[i]=val[i].second-val[i].first;
sm+=val[i].first;
}
sort(all(df));
bool stat=sta^tog;
if(stat){
if(sz(child[x])==0) return memo[x][sta][tog]=1e9;
sm+=df[0];
}
int mnSUM=sm;
for (int i = stat; i < sz(child[x])-1; i+=2) {
sm+=df[i]+df[i+1];
mnSUM=min(mnSUM,sm);
}
return memo[x][sta][tog]=mnSUM+tog;
}
signed main() {
ios_base::sync_with_stdio(false); cin.tie(nullptr);
cin >> n;
neigh.resize(n);
on.resize(n);
child.resize(n);
memo.resize(n,vector<vector<int>>(2,vector<int>(2,-1)));
for (int i = 0; i < n-1; i++)
{
int a,b; cin >> a >> b;
a--; b--;
neigh[a].push_back(b);
neigh[b].push_back(a);
}
for (int i = 0; i < n; i++) cin >> on[i];
make_tree(0, -1);
int d=min(dp(0,0,1),dp(0,0,0));
if(d>=1e9) cout << "impossible\n";
else cout << d << "\n";
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... |