树形dp
最近各种水树形dp。。。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#define INF 200000000
int dp[10005],first[10005],next[20005],re[10005];
struct edge
{
int u;
int v;
}en[20005];
void add(int a,int b,int p)
{
en[p].u=a;
en[p].v=b;
next[p]=first[a];
first[a]=p;
}
void getdp(int s,int f)
{
int i;
for(i=first[s];i!=-1;i=next[i])
{
if(en[i].v==f)
continue;
else
{
getdp(en[i].v,s);
dp[s]+=dp[en[i].v];
}
}
dp[s]++;
}
int main()
{
int n,i,j,k,l,a,b,flag,idx,tot;
while(scanf("%d",&n)!=EOF)
{
memset(first,-1,sizeof(first));
memset(next,-1,sizeof(next));
memset(dp,0,sizeof(dp));
idx=0;
for(i=1;i<n;i++)
{
scanf("%d%d",&a,&b);
idx++;
add(a,b,idx);
idx++;
add(b,a,idx);
}
/*for(i=1;i<=idx;i++)
printf("%d %d %d\n",i,en[i].u,en[i].v);*/
getdp(1,-1);
/*for(i=1;i<=n;i++)
printf("%d ",dp[i]);
printf("\n");*/
tot=0;
for(i=1;i<=n;i++)
{
flag=0;
for(j=first[i];j!=-1;j=next[j])
{
if(dp[en[j].v]<dp[i])
if(dp[en[j].v]>n/2)
{
flag=1;break;
}
}
if(n-dp[i]>n/2)
flag=1;
if(flag)
continue;
re[++tot]=i;
}
if(tot==0)
printf("NONE\n");
else
{
for(i=1;i<=tot;i++)
printf("%d\n",re[i]);
}
/*for(i=1;i<=n;i++)
printf("%d ",dp[i]);*/
}
return 0;
}