#include <bits/stdc++.h>
#define fst first
#define snd second
#define pb push_back
#define mset(a,v) memset(a,v,sizeof(a))
#define SZ(x) (int)x.size()
#define ALL(x) x.begin(),x.end()
#define forn(i,a,b) for(int i = a; i<b; i++)
#ifdef D
#define debug(x) cout << x
#else
#define debug(x) //nothing
#endif
using namespace std;
typedef long long ll;
const int MAXN = 2000+5;
ll n;
vector<ll> adj[MAXN];
bool is[MAXN];
ll dp[MAXN][3];
ll f(ll nd , ll t, ll p){
ll &res = dp[nd][t];
if(res!=-1) return res;
if(is[nd]){
res=1;
}else res=0;
if(t==0){
ll pres = 0;
for(auto i:adj[nd]) if(i!=p){
pres+=f(i,0,nd);
}
res=max(res,pres- (is[nd]?1:0));
}else{
ll best = 0;
for(auto i:adj[nd]) if(i!=p){
best=max(best,f(i,0,nd));
}
res=max(res,best+(is[nd]?1:0));
}
debug(" "<<nd<<" "<<p<<" "<<res<<'\n');
return res;
}
int main(){
cin>>n;
ll u,v;
forn(i,0,n-1){
cin>>u>>v; u--; v--;
adj[u].pb(v);
adj[v].pb(u);
}
string s; cin>>s;
forn(i,0,n) is[i]=(s[i]=='1');
ll res = 1;
forn(i,0,n){
debug("raiz "<<i<<"----------------\n");
mset(dp,-1);
res=max(res, f(i,0,-1));
mset(dp,-1);
res=max(res, f(i,1,-1));
}
cout<<res<<'\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... |