题意:给出一棵树,求树上一点使得使得删除一点后该树的最大子树最小。
树的重心裸题,直接跑dfs,更新其最大子树大小
#include<bits/stdc++.h> using namespace std; const int maxx = 20010; const int inf = 0x3f3f3f3f; int vis[maxx],son[maxx]; int ans,d,n; vector<int>q[maxx]; void dfs(int u) { vis[u]=1;son[u]=0; int temp=0; for(int i=0;i<q[u].size();i++) { int v=q[u][i]; if(vis[v])continue; dfs(v); son[u]+=son[v]+1; temp=max(temp,son[v]+1);//求u为根时子树的最大值 } temp=max(temp,n-son[u]-1);//父节点的那个子树 if(temp<ans||(temp==ans&&u<d)) { ans=temp;d=u; } } int main() { int t; cin>>t; while(t--) { memset(vis,0,sizeof(vis)); memset(son,0,sizeof(son)); int a,b; scanf("%d",&n); for(int i=1;i<=n;i++)q[i].clear(); for(int i=1;i<n;i++) { scanf("%d%d",&a,&b); q[a].push_back(b); q[b].push_back(a); } d=0;ans=inf; dfs(1); printf("%d %d ",d,ans); } return 0; }