您的位置:首页 > 其它

SRM 559 Div1 500 HatRack

2017-04-30 19:26 375 查看
/*
计算出每个节点对应子树的方法相乘即可
*/
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define M 55
int n,ch[M][M];
vector<int>G[M];
ll dfs(int x,int f=0,int p=1){
ch[x][0]=0;
for(int i=0;i<G[x].size();i++)if(G[x][i]!=f)
ch[x][++ch[x][0]]=G[x][i];
if(ch[x][0]==0&&p*2>n)return 1;
if(ch[x][0]==1&&p*2==n)return dfs(ch[x][1],x,p<<1);
if(ch[x][0]==2){
int l1=dfs(ch[x][1],x,p<<1);
int r2=dfs(ch[x][2],x,p<<1|1);
int l2=dfs(ch[x][2],x,p<<1);
int r1=dfs(ch[x][1],x,p<<1|1);
return 1ll*l1*r2+l2*r1;
}return 0;
}
int main(){
scanf("%d",&n);
for(int i=1,x,y;i<n;i++){
scanf("%d%d",&x,&y);
G[x].push_back(y);G[y].push_back(x);
}ll ans=0;
for(int i=1;i<=n;i++)ans+=dfs(i);
cout<<ans<<'\n';
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: