1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
| #define int long long #define maxn 200005 int n; vector<int>to[maxn]; int siz[maxn]; vector<int>f[maxn][2]; int K,g[505][2]; const int inf=1e9; #define pb push_back inline void dfs(int x,int pre) { int i,j;siz[x]=1; f[x][0].pb(inf),f[x][1].pb(inf),f[x][0].pb(1),f[x][1].pb(2); for (auto y:to[x]) if (y^pre) { dfs(y,x); for (i=1;i<=min(K,siz[x]+siz[y]);i++) g[i][0]=g[i][1]=inf; for (i=1;i<=min(K,siz[x]);i++) for (j=1;j<=min(K-i,siz[y]);j++){ g[i+j][0]=min(g[i+j][0],f[x][0][i]+f[y][0][j]-i*(i+1)/2-j*(j+1)/2+(i+j)*(i+j+1)/2); g[i+j][1]=min(g[i+j][1],f[x][1][i]+f[y][1][j]-i*(i+1)-j*(j+1)+(i+j)*(i+j+1)); } int ans1=inf,ans2=inf; for (j=1;j<=min(K,siz[y]);j++) ans1=min(ans1,f[y][0][j]),ans2=min(ans2,f[y][1][j]); for (i=1;i<=min(K,siz[x]);i++) g[i][0]=min(g[i][0],f[x][0][i]+ans2),g[i][1]=min(g[i][1],f[x][1][i]+ans1); for (i=siz[x]+1;i<=min(K,siz[x]+siz[y]);i++) f[x][0].pb(inf),f[x][1].pb(inf); siz[x]+=siz[y]; for (i=1;i<=min(K,siz[x]);i++) f[x][0][i]=g[i][0],f[x][1][i]=g[i][1]; f[y][0].clear();f[y][0].shrink_to_fit(); f[y][1].clear(),f[y][1].shrink_to_fit(); } } inline void solve(void) { int i,x,y; read(n);K=min(500ll,2+(int)sqrt(n)*2); for (i=1;i<=n;i++) { to[i].clear(); f[i][0].clear(),f[i][0].shrink_to_fit(); f[i][1].clear(),f[i][1].shrink_to_fit(); } for (i=1;i<n;i++) { read(x),read(y); to[x].push_back(y); to[y].push_back(x); } dfs(1,0); int ans=inf; for (i=1;i<=min(K,siz[1]);i++) ans=min(ans,min(f[1][0][i],f[1][1][i])); printf("%lld\n",n*(n+1)-ans); } signed main(void){ int T; read(T); while (T--) solve(); return 0; }
|