POJ--2378--Tree Cutting--树形DP

来源:互联网 发布:最新淘宝客网站程序 编辑:程序博客网 时间:2024/06/05 17:32

介个,,,会了1655很自然就会这个题了,简直就是一模一样的

#include<iostream>#include<cstring>#include<vector>#include<cstdio>#include<algorithm>#define INF 99999999#define maxn 12000using namespace std;int n;int p[maxn];int ans[maxn],ic;int num[maxn];vector<int> g[maxn];void build(int u){for(int i=0;i<g[u].size();i++){int v=g[u][i];if(v==p[u])continue;p[v]=u;build(v);}}void init(){int x,y;memset(p,-1,sizeof(p));ic=0;scanf("%d",&n);for(int i=1;i<n;i++){scanf("%d%d",&x,&y);g[x].push_back(y);g[y].push_back(x);}build(1);}int dfs(int u){int sum=0;for(int i=0;i<g[u].size();i++){int v=g[u][i];if(p[u]==v)continue;int res=dfs(v);sum+=res;num[u]=max(num[u],res);}num[u]=max(num[u],n-sum-1);return sum+1;}
//debug  codevoid op_tree(int u){printf("%d ",u);for(int i=0;i<g[u].size();i++){int v=g[u][i];if(v==p[u])continue;op_tree(v);}}void op(){op_tree(1);}//------------------debug code end
void solve(){for(int i=1;i<=n;i++)num[i]=-INF;dfs(1);//op();for(int i=1;i<=n;i++){if(num[i]<=n/2){ans[ic++]=i;}}sort(ans,ans+ic);//printf("----------------\n");for(int i=0;i<ic;i++)printf("%d\n",ans[i]);//printf("-------------\n");}int main(){init();solve();return 0;}


原创粉丝点击