您的位置:首页 > 其它

pku 2378 Tree Cutting

2011-07-23 11:08 225 查看
和上一篇博客介绍的那题的一样的,简单的树形DP;

题意:给你一棵树,然后让你找到这样的一些点,这个点去掉后,分割出来的子树的个数都小于等于 N/2

代码:

View Code

# include<stdio.h>
# include<string.h>
# define N 10005
struct node{
int from,to,next;
}edge[2*N];
int head
,tol,visit
,val
,n;
void add(int a,int b)
{
edge[tol].from=a;edge[tol].to=b;edge[tol].next=head[a];head[a]=tol++;
}
int max(int a,int b)
{
return a>b?a:b;
}
int dfs(int root,int father)
{
int j,u,Max,temp,sum;
sum=1;
Max=-1;
for(j=head[root];j!=-1;j=edge[j].next)
{
u=edge[j].to;
if(u!=father)
{
temp=dfs(u,root);
sum+=temp;
Max=max(Max,temp);
}
}
val[root]=max(Max,n-sum);
return sum;
}
int main()
{
int i,a,b;
scanf("%d",&n);
memset(head,-1,sizeof(head));
tol=0;
for(i=1;i<n;i++)
{
scanf("%d%d",&a,&b);
add(a,b);
add(b,a);
}
dfs(1,0);
for(i=1;i<=n;i++)
{
if(val[i]<=n/2) printf("%d\n",i);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: