hdu5379 Mahjong tree 树形DP
2015-08-11 22:28
387 查看
题目本身并不难,就是解决起来有些繁琐。
首先一个节点的非叶子节点若大于2则不存在,答案为0。否则讨论非叶子结点的数目0||1||2,同时也要考虑有没有叶子节点。
有些子树的根节点可以选首尾,有些已经确定了,用flag来标识。
首先一个节点的非叶子节点若大于2则不存在,答案为0。否则讨论非叶子结点的数目0||1||2,同时也要考虑有没有叶子节点。
有些子树的根节点可以选首尾,有些已经确定了,用flag来标识。
#pragma comment(linker, "/STACK:1024000000,1024000000") #include<iostream> #include<cstring> #include<cstdio> #include<algorithm> #include<queue> #define pii pair<ll,int> #define inf (1ll<<60) #define ll long long using namespace std; const int maxn=100005; const ll mod=1000000007; int n; vector<int>g[maxn]; ll jie[maxn]; int sum[maxn]; int lf[maxn]; int nl[maxn]; int tree[maxn][10]; bool dfs(int u,int fa) { sum[u]=1; int cnt=0; lf[u]=nl[u]=0; for(int i=0;i<g[u].size();i++) { if(g[u][i]==fa) continue; if(!dfs(g[u][i],u)) return false; sum[u]+=sum[g[u][i]]; if(sum[g[u][i]]>1) { cnt++; nl[u]++; tree[u][cnt-1]=g[u][i]; } else { lf[u]++; } if(cnt>2) return false; } return true; } ll gao(int u,int flag) { ll ans=1; if(nl[u]==0) { ans=jie[sum[u]-1]; } else if(nl[u]==1) { if(lf[u]>0) ans=gao(tree[u][0],1)*2%mod; else ans=gao(tree[u][0],0); ans=ans*jie[lf[u]]%mod; } else { ans=gao(tree[u][0],1)*gao(tree[u][1],1)%mod*2%mod*jie[lf[u]]%mod; } if(!flag) ans=ans*2%mod; return ans; } int main() { jie[0]=1; for(int i=1;i<=100000;i++) { jie[i]=jie[i-1]*i%mod; } int t; scanf("%d",&t); int a,b; int cas=1; while(t--) { scanf("%d",&n); if(n==1) { printf("Case #%d: 1\n",cas++); continue; } for(int i=1;i<=n;i++) g[i].clear(); for(int i=0;i<n-1;i++) { scanf("%d%d",&a,&b); g[a].push_back(b); g[b].push_back(a); } if(!dfs(1,-1)) { printf("Case #%d: 0\n",cas++); continue; } printf("Case #%d: %lld\n",cas++,gao(1,0)); } return 0; }
相关文章推荐
- LeetCode(199) Binary Tree Right Side View
- Html(5)其他(缓存 及 js控制css)
- C/C++带括号的四则运算
- C语言中的数组名
- Light 1039 - A Toy Company (bfs)
- 1.单例设计模式(懒汉式,饿汉式,枚举式,双重检测锁式,静态内部类式)
- 企业招聘,慎选BAT出来的人
- 第七章 内存管理
- hdu 2002 计算球体积
- 关于Android中的四大组件(Activity)
- java代码中 路径符号的写法
- 要实践不要忽悠的“云计算应用创新推进大会”
- 黑马程序员——self使用
- (一一八)利用block实现链式编程
- 文件/目录权限设置命令chmod的详细用法
- Python学习笔记1
- JavaScript 编程
- 黑马程序员——Java基础---常用类,基本类型包装类,正则表达式
- 文件/目录权限设置命令chmod的详细用法
- (一一八)利用block实现链式编程