poj2378,Tree Cutting

来源:互联网 发布:java经典书籍分享 编辑:程序博客网 时间:2024/05/18 00:57

树形dp

最近各种水树形dp。。。

#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>#define INF 200000000int 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;}


0 0
原创粉丝点击