爆零求调
查看原帖
爆零求调
376997
Harry27182SDream楼主2022/7/7 18:47
#include<bits/stdc++.h>
#define int long long
using namespace std;
struct edge
{
	int v,nxt;
}e[1000005];
struct node
{
	int val,dis,len;
}q[500005];
int h[500005],cnt,n,m,u,v,c[500005],f[500005],size[500005];
bool cmp(node a,node b)
{
	return a.val>b.val;
}
void add(int u,int v)
{
	e[++cnt].v=v;
	e[cnt].nxt=h[u];
	h[u]=cnt;
}
void dfs(int u,int fa)
{
	size[u]=1;f[u]=c[u];cnt=0;
	for(int i=h[u];i;i=e[i].nxt)
	{
		int v=e[i].v;
		if(v==fa)continue;
		dfs(v,u);
		q[++cnt]=(node){f[v]-2*size[v]+2,f[v]+1,2*size[v]};
		size[u]+=size[v];
	}
	sort(q+1,q+cnt+1,cmp);
	int sum=0;
	for(int i=1;i<=cnt;i++)
	{
		f[u]=max(f[u],q[i].val+sum);
		sum+=q[i].dis;
		q[i]=(node){0,0,0};
	}
}
signed main()
{
	scanf("%lld",&n);
	for(int i=1;i<=n;i++)scanf("%lld",&c[i]);
	for(int i=1;i<n;i++)
	{
		scanf("%lld%lld",&u,&v);
		add(u,v);
		add(v,u);
	}
	dfs(1,0);
	printf("%lld",max(f[1],2*n-2+c[1]));
	return 0;
}
2022/7/7 18:47
加载中...