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\n",F[1]);
return 0;
}

浙公网安备 33010602011771号