mx=max(mx,n-num[u]);就是这个转移方程。。。。。 #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxedge=50005; struct node{ int v,next; }edge[maxedge*2]; int edgehead[maxedge],vis[maxedge],k,n,mxedge; int num[maxedge],ans[maxedge],top=0; inline void addedge(int u,int v){ edge[k].v=v; edge[k].next=edgehead[u]; edgehead[u]=k++; edge[k].v=u; edge[k].next=edgehead[v]; edgehead[v]=k++; } void dfs(int u){ int i,v,mx=-1; vis[u]=1; num[u]=1; for(i=edgehead[u];i!=-1;i=edge[i].next){ v=edge[i].v; if(!vis[v]){ dfs(v); num[u]+=num[v]; mx=max(mx,num[v]); } } mx=max(mx,n-num[u]); if(mx<mxedge){ top=0;ans[top++]=u;mxedge=mx; } else if(mx==mxedge){ ans[top++]=u; } } bool cmp(const int &a,const int &b){ return a<b; } int main() { int i,a,b; scanf("%d",&n); k=0;mxedge=100000000; top=0; memset(edgehead,-1,sizeof(edgehead)); memset(vis,0,sizeof(vis)); memset(num,0,sizeof(num)); for(i=1;i<n;i++){ scanf("%d%d",&a,&b); addedge(a,b); } dfs(1); sort(ans,ans+top,cmp); printf("%d",ans[0]); for(i=1;i<top;i++) printf(" %d",ans[i]); printf("/n"); return 0; }