pku 2378 Tree Cutting

和上一篇博客介绍的那题的一样的,简单的树形DP;

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

代码:

ContractedBlock.gif ExpandedBlockStart.gif View Code
 1 # include<stdio.h>
2 # include<string.h>
3 # define N 10005
4 struct node{
5 int from,to,next;
6 }edge[2*N];
7 int head[N],tol,visit[N],val[N],n;
8 void add(int a,int b)
9 {
10 edge[tol].from=a;edge[tol].to=b;edge[tol].next=head[a];head[a]=tol++;
11 }
12 int max(int a,int b)
13 {
14 return a>b?a:b;
15 }
16 int dfs(int root,int father)
17 {
18 int j,u,Max,temp,sum;
19 sum=1;
20 Max=-1;
21 for(j=head[root];j!=-1;j=edge[j].next)
22 {
23 u=edge[j].to;
24 if(u!=father)
25 {
26 temp=dfs(u,root);
27 sum+=temp;
28 Max=max(Max,temp);
29 }
30 }
31 val[root]=max(Max,n-sum);
32 return sum;
33 }
34 int main()
35 {
36 int i,a,b;
37 scanf("%d",&n);
38 memset(head,-1,sizeof(head));
39 tol=0;
40 for(i=1;i<n;i++)
41 {
42 scanf("%d%d",&a,&b);
43 add(a,b);
44 add(b,a);
45 }
46 dfs(1,0);
47 for(i=1;i<=n;i++)
48 {
49 if(val[i]<=n/2) printf("%d\n",i);
50 }
51 return 0;
52 }

转载于:https://www.cnblogs.com/183zyz/archive/2011/07/23/2114691.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值