BZOJ 3829: [Poi2014]FarmCraft

贪心,把前一个答案比后一个优的标准作为排序标准

#include<cstdio>
#include<algorithm>
using namespace std;
int Val,n,cnt,F[500005],sz[500005],last[500005];
struct node{
	int to,next;
}e[1000005];
struct node1{
	int val,val1;
}E[500005];
bool cmp(node1 a,node1 b){
	return max(a.val,a.val1+b.val)<max(b.val,b.val1+a.val);
//	return a.val-a.val1<b.val-b.val1;
}
void add(int a,int b){
	e[++cnt].to=b;
	e[cnt].next=last[a];
	last[a]=cnt;
}
void dfs(int x,int fa){
	sz[x]=1;
	for (int i=last[x]; i; i=e[i].next){
		int V=e[i].to;
		if (V==fa) continue;
		dfs(V,x);
		sz[x]+=sz[V];
	}
	int cnt=0;
	for (int i=last[x]; i; i=e[i].next){
		int V=e[i].to;
		if (V==fa) continue;
		E[++cnt]=(node1){F[V],sz[V]*2};
	}
	sort(E+1,E+cnt+1,cmp);
	int S=0;
	for (int i=1; i<=cnt; i++){
		F[x]=max(F[x],S+1+E[i].val);
		S+=E[i].val1;
	}
	if (x==1) F[x]=max(F[x],2*(n-1)+Val);
}
int main(){
	scanf("%d",&n);
	for (int i=1; i<=n; i++) scanf("%d",&F[i]);
	Val=F[1];
	for (int i=1; i<n; i++){
		int x,y;
		scanf("%d%d",&x,&y);
		add(x,y);
		add(y,x);
	}
	dfs(1,0);
	printf("%d
",F[1]);
	return 0;
}

  

原文地址:https://www.cnblogs.com/silenty/p/9849915.html