PKU POJ 2378 Tree Cutting 搜索

任选一个节点作为树根开始搜索,保存每个节点的各个子树大小。最后枚举各个节点,找出所有子树大小均不超过n/2并且除掉这些子树及自身剩下的树的大小也不超过n/2的节点输出。

#include<iostream>
#include <vector>
#define M 10005
using namespace std;
int n;
bool flag[M];
vector<int> son[M];
vector<int> cnt[M];
int dfs(int node)
{
    flag[node]=true;
    int i,res=1;
    for (i=0;i<son[node].size();++i)
        if (!flag[son[node][i]])
            cnt[node].push_back(dfs(son[node][i]));
    for (i=0;i<cnt[node].size();++i)
        res+=cnt[node][i];
    return res;
}
bool judge(int node)
{
    int sum=0,i;
    for (i=0;i<cnt[node].size();++i)
    {
        if (cnt[node][i]>n/2)
            return false;
        else
            sum+=cnt[node][i];
    }
    if (sum+1>=n/2)
        return true;
    else
        return false;
}
int main()
{
    int i,x,y;
    while (scanf("%d",&n)!=EOF)
    {
        for (i=1;i<=n;++i)
        {
            son[i].clear();
            cnt[i].clear();
        }
        for (i=1;i<n;++i)
        {
            scanf("%d%d",&x,&y);
            son[x].push_back(y);
            son[y].push_back(x);
        }
        memset(flag,false,n+1);
        dfs(1);
        for(i=1;i<=n;++i)
            if (judge(i))
                printf("%d\n",i);
    }
    return 0;
}

 

posted on 2013-03-06 12:35  Deller  阅读(161)  评论(0)    收藏  举报

导航