贪心,把前一个答案比后一个优的标准作为排序标准
#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; }