http://poj.org/problem?id=2378

他人具体代码:

View Code
#include<cstdio>
#include<vector>
#include<cstring>
using namespace std;
const int maxn = 10010;
vector<int> edge[maxn];
int sum[maxn],ans[maxn],n;
void dfs(int u,int fa){
     sum[u]=1;
     int i,j; 
     bool flag=true;
     for(i=0;i<edge[u].size();i++){
         int to=edge[u][i];
         if(to==fa) continue ;
         dfs(to,u);
         if(sum[to]>n/2) flag=false;
         sum[u]+=sum[to];
     }
     if(flag&&n-sum[u]<=n/2) ans[u]=true;
}
int main(){
    int i,a,b;
    while(scanf("%d",&n)!=EOF){
        memset(ans,0,sizeof(ans));
        for(i=0;i<=n;i++) edge[i].clear();
        for(i=0;i<n-1;i++){
            scanf("%d%d",&a,&b);
            edge[a].push_back(b);
            edge[b].push_back(a);
        }
        dfs(1,0);
        for(i=1;i<=n;i++){
            if(ans[i])
                printf("%d\n",i);
        }
        puts("");
    }
    return 0;
}