解析:
f[u]:表示以u为根的连通块的黑点数-白点数绝对值最大
因为绝对值不好处理,所以我们分开来计算
第一种就是给白色点填充1,黑色点填充-1 然后dfs记录每个节点为根的最大情况
第二种就是给白色点填充-1,黑色点填充1 然后dfs记录每个节点为根的最大情况
两种取最大值即可
#include <bits/stdc++.h>
using namespace std;
const int N=5e5+1000;
int f[N];
int n,a[N];
int d[N];
int x,y;
vector G[N];
void dfs(int u,int fa)
{
f[u]=d[u];
for(auto v: G[u])
{
if(v==fa) continue;
dfs(v,u);
if(f[v]>0) f[u]+=f[v];
}
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
for(int i=1;i<=n-1;i++)
{
scanf("%d %d",&x,&y);
G[x].push_back(y);
G[y].push_back(x);
}
int ans=0;
for(int i=1;i<=n;i++) d[i]= a[i] ? 1:-1;
dfs(1,-1);
for(int i=1;i<=n;i++) ans=max(ans,f[i]);
for(int i=1;i<=n;i++) d[i]= a[i] ? -1 : 1;
dfs(1,-1);
for(int i=1;i<=n;i++) ans=max(ans,f[i]);
printf("%d\n",ans);
return 0;
}