Luogu P3554 [POI2013]LUK-Triumphal arch
答案具有二分性,可以二分
显然,人是没有办法回头的,具有最优子结构的性质,考虑树形DP
令f[i]表示以i为根(不包括i)的子树中还需要多少个节点(如果不需要,即为0,不为负)
f[u]=max( (∑f[v]+1)-mid,0 )
如果f[1]>0,则不行
#include<bits/stdc++.h> using namespace std; const int N=2e6+5; int n,cnt,to[N],nxt[N],he[N],f[N]; inline void add(int u,int v) { to[++cnt]=v,nxt[cnt]=he[u],he[u]=cnt; } void dfs(int fa,int u,int mid) { f[u]=0; for(int e=he[u];e;e=nxt[e]) { int v=to[e]; if(v!=fa) { dfs(u,v,mid); f[u]+=f[v]+1; } } f[u]=max(f[u]-mid,0); } int main() { scanf("%d",&n); for(int i=1;i<n;i++) { int u,v; scanf("%d%d",&u,&v); add(u,v),add(v,u); } int l=0,r=n,ans=0; while(l<=r) { int mid=l+r>>1; dfs(0,1,mid); if(f[1]>0) l=mid+1; else ans=mid,r=mid-1; } printf("%d\n",ans); return 0; }