#include #include using namespace std; using namespace atcoder; #define rep(i, l, r) for (ll i = (l); i < (r); ++i) #define all(x) (x).begin(), (x).end() #define sz(x) (int)(x).size() using ll = long long; using ull = unsigned long long; using ld = long double; using pl = pair; using vi = vector; using vl = vector; using vvl = vector>; using vvvl = vector>>; template using pq_ = priority_queue, greater>; #define sz(x) (int)(x).size() typedef pair pii; using mint=modint998244353; // g++ a.cpp -std=c++23 -I. // g++ -std=c++23 -I. a.cpp -o main // g++ -std=c++23 -I. anaive.cpp -o naive // g++ -std=c++23 -I. agene.cpp -o gene #include #include namespace mp = boost::multiprecision; using Bint = mp::cpp_int; using Real = mp::number>; int main(){ ios::sync_with_stdio(false); std::cin.tie(nullptr); ll n; cin>>n; vl a(n-1); vl b(n-1); rep(i,0,n-1){ cin>>a[i]>>b[i]; a[i]--; b[i]--; } vl z(n); rep(i,0,n){ cin>>z[i]; } vvl g(n); ll ans=0; vl c(n); rep(i,0,n-1){ if(z[a[i]]==z[b[i]])ans++; else if(z[a[i]]==1)c[b[i]]++; else if(z[b[i]]==1)c[a[i]]++; else { g[a[i]].push_back(b[i]); g[b[i]].push_back(a[i]); } } vector e(n,false); auto dfs = [&](auto self,ll now) -> array { vector> u; e[now]=true; vector> r; rep(i,0,g[now].size()){ if(e[g[now][i]]==false){ e[g[now][i]]=true; r.push_back(self(self,g[now][i])); } } array zans={0,0,0}; ll e=-10000000000; rep(i,0,r.size()){ zans[0]+=max(r[i][0],r[i][1]); zans[1]+=max(r[i][0],r[i][1]+1); e=max(e,r[i][2]+1-max(r[i][0],r[i][1]+1)); zans[2]+=max(r[i][0],r[i][1]+1); } zans[1]+=e; zans[1]+=c[now]; zans[2]+=c[now]; return zans; }; rep(i,0,n){ if(z[i]!=1&&(!(c[i]))){ auto u=dfs(dfs,i); ans+=max(u[0],u[1]); } } cout<