和上一篇博客介绍的那题的一样的,简单的树形DP;
题意:给你一棵树,然后让你找到这样的一些点,这个点去掉后,分割出来的子树的个数都小于等于 N/2
代码:
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 }