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; }
浙公网安备 33010602011771号