SRM559 Div1Medium HatRack

来源:互联网 发布:薛之谦的淘宝男装店 编辑:程序博客网 时间:2024/05/19 15:18

这题比较水
我们先枚举一个点为根,
然后递归下去,
若某一节点儿子的数量不等于它的二叉树上的编号应有的儿子数,则方案不可行,
树形dp即可
代码如下:

#include<bits/stdc++.h>using namespace std;#define M 55vector<int>edge[M];int n;int dfs(int x,int pre,int p){    int res=0,sz=edge[x].size();    if(pre==-1)sz++;    if(sz>3||sz==3&&2*p>=n||sz==2&&2*p!=n||sz==1&&2*p<=n)return 0;    if(sz==3){        if(2*p>=n)return 0;        int tmp=1;        for(int i=0,k=0;i<edge[x].size();i++){            int y=edge[x][i];            if(y==pre)continue;            tmp*=dfs(y,x,p*2+k);            k++;        }        res+=tmp;        tmp=1;        for(int i=0,k=0;i<edge[x].size();i++){            int y=edge[x][i];            if(y==pre)continue;            tmp*=dfs(y,x,p*2+1-k);            k++;        }        res+=tmp;        return res;    }    return 1;}int main(){    int ans=0;    scanf("%d",&n);    for(int i=1;i<n;i++){        int a,b;        scanf("%d %d",&a,&b);        edge[a].push_back(b);        edge[b].push_back(a);    }    for(int i=1;i<=n;i++)        ans+=dfs(i,-1,1);    printf("%d\n",ans);    return 0;}