HDU5379

来源:互联网 发布:淘宝的淘金币怎么赚 编辑:程序博客网 时间:2024/04/29 03:02

在一棵树上给所有点标号,要求任意一个子树里的点编号连续,每一个点的儿子编号连续。 那么,一个点的非叶子儿子应该是连续的,即一个点的非叶子儿子最多只有两个,一个放在头,一个放在尾。 对于每一个点,我们把它的叶子儿子的个数记作S,所有儿子的方案数积为T。当非叶子儿子节点个数等于1的时候,方案数为2T*(S!)因为这个儿子可以放头也可以放尾,答案还要乘上2。 当非叶子儿子节点数等于2的时候,这个点为根的子树合法方案数位T*(S!). 这样dfs一遍即可以处理整棵树的方案数。

#include <iostream>#include <cstdio>#include <cstring>#include <cstdlib>#include <cmath>#include <algorithm>#include <queue>#include <map>#include <set>#include <vector>#include <string>#include <stack>#include <bitset>#define INF 0x3f3f3f3f#define eps 1e-8#define FI first#define SE secondusing namespace std;typedef long long LL;const int mod = 1e9 + 7;const int N = 100005;int head[N];struct Edge {int nxt, to;} ed[N * 2];int ecnt;void addedge(int u, int v) {ed[ecnt].nxt = head[u];ed[ecnt].to = v;head[u] = ecnt++;}int fac[N];//fac[i]表示i的阶乘int dp[N];//dp[i]以i为根的方法数的一半int sz[N];//sz[i]表示包括i在内的以i为根的子树的节点总个数int son[N];//son[i]第i个非叶子儿子组合方法数bool dfs(int u, int fa) {sz[u] = 1;for (int e = head[u]; ~e; e = ed[e].nxt) {int v = ed[e].to;if (v == fa) continue;if (!dfs(v, u)) return 0;sz[u] += sz[v];}int c1 = 0, c2 = 0;//c1记录非叶子儿子个数,c2记录叶子儿子个数for (int e = head[u]; ~e; e = ed[e].nxt) {int v = ed[e].to;if (v == fa) continue;if (sz[v] > 1) {son[c1++] = dp[v];}else {c2++;}}if (c1 > 2) return 0;//若有多于2个非叶子儿子则无解if (c1 == 0) {//没有非叶子儿子,则组合数为叶子儿子的排列组合dp[u] = fac[c2];}else if (c1 == 1) {//只有一个非叶子儿子,可以一个放在头,一个放在尾,所以乘以2dp[u] = 2LL * son[0] * fac[c2] % mod;}else {//有两个非叶子儿子,肯定是一个放在头,一个放在尾,两者可以交换,所以乘以2dp[u] = 2LL * son[0] * son[1] % mod * fac[c2] % mod;}return 1;}int main() {fac[0] = 1;for (int i = 1; i < N; ++i) {fac[i] = (LL)fac[i - 1] * i % mod;}int T;scanf("%d", &T);for (int cas = 1; cas <= T; ++cas) {int n;scanf("%d", &n);memset(head, -1, (n + 3) * sizeof(int));ecnt = 0;for (int u, v, i = 1; i < n; ++i) {scanf("%d%d", &u, &v);addedge(u, v);addedge(v, u);}printf("Case #%d: ", cas);if (n == 1) {puts("1");continue;}if (dfs(1, 0)) {printf("%d\n", dp[1] * 2 % mod);//根有两种选择,分别是放头和尾,所以乘以2}else {puts("0");}}return 0;}



0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 饮水机放桶漏水怎么办 热水器热水阀门漏水怎么办 热水器热水出口漏水怎么办 热水器上水管漏水怎么办 水管往外漏水怎么办 ppr热水管漏水怎么办 大半夜水闸爆了怎么办 热水器不热水了怎么办 水龙头外皮裂了怎么办 电热水龙头坏了怎么办 太阳能存不住水怎么办 混水阀断裂漏水怎么办 洗澡淋浴头漏水怎么办 马桶有异物堵住怎么办 捷达机油盖漏油怎么办 乳化油臭了怎么办 自行车前叉严重生锈怎么办 自行车链条生锈了怎么办 自行车链子生锈了怎么办 对切削液过敏怎么办 齿轮油加到机油怎么办 机油加液压油里怎么办 液压油里面有水怎么办 加油站双层复合管漏油怎么办 预制屋面板底面渗漏怎么办 焊电焊眼睛疼怎么办 下水主管道篦子怎么办 墙里热水管堵了怎么办 热水管堵住了怎么办 热水管堵塞了怎么办 下水道被油渍堵死怎么办 赛欧车门打不开怎么办 气囊开车门变形怎么办 镀烙金属生锈怎么办 热水器角阀漏水怎么办 淋浴头自动出水怎么办 抽水泵烧了怎么办 压力泵不上水怎么办 chnt电表跳闸了怎么办 应急灯故障灯亮怎么办 消防应急灯不亮怎么办