您的位置:首页 > 其它

poj 2378(树形dp)

2013-10-03 21:29 441 查看
题目链接:http://poj.org/problem?id=2378

思路:num[u]表示以u为根的子树的顶点个数(包括),如果去掉u之后u的每棵子树都小于等于n/2,则选择u。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
#define MAXN 11111
#define FILL(a,b) memset(a,b,sizeof(a))

int n,num[MAXN];
bool mark[MAXN];
vector<vector<int> >g;

int dfs(int u,int father)
{
num[u]=1;
bool flag=true;
for(int i=0;i<g[u].size();i++){
int v=g[u][i];
if(v==father)continue;
int tmp=dfs(v,u);
if(tmp>n/2)flag=false;
num[u]+=num[v];
}
if(flag&&n-num[u]<=n/2)mark[u]=true;
return num[u];
}

int main()
{
int u,v;
while(~scanf("%d",&n)){
g.clear();
g.resize(n+2);
for(int i=1;i<n;i++){
scanf("%d%d",&u,&v);
g[u].push_back(v);
g[v].push_back(u);
}
FILL(mark,false);
dfs(1,-1);
for(int i=1;i<=n;i++)if(mark[i])printf("%d\n",i);
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: