您的位置:首页 > 产品设计 > UI/UE

lightOJ 1382 The Queue

2017-01-10 20:28 239 查看

题目分析

具体看代码吧,树形dp的思想,dp[i]表示父节点下面所有子树节点合理排列的方法数。。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 1005;
const int mod = 1e9+7;
#define LL long long

LL head[maxn], tot, dp[maxn], num[maxn], degree[maxn], C[maxn][maxn];

struct Edge{
int to, next;
}e[maxn];

void addedge(int from, int to){
e[tot].to = to;
e[tot].next = head[from];
head[from] = tot++;
}

void dfs(int u){
dp[u] = 1, num[u] = 1;
for(int i = head[u]; i != -1; i = e[i].next){
int v = e[i].to;
dfs(v);
num[u] += num[v];
dp[u] = C[num[u]-1][num[v]]*dp[u]%mod*dp[v]%mod;
}
}

void init(){
tot = 0;
memset(degree, 0, sizeof(degree));
memset(dp, 0, sizeof(dp));
memset(head, -1, sizeof(head));
}

int main(){
for(int i = 0; i < maxn; i++){
C[i][0] = C[i][i] = 1;
for(int j = 1; j < i; j++) C[i][j] = (C[i-1][j] + C[i-1][j-1])%mod;
}
int T, n;
scanf("%d", &T);
for(int kase = 1; kase <= T; kase++){
init();
scanf("%d", &n);
int from, to;
for(int i = 1; i < n; i++){
scanf("%d%d", &from, &to);
addedge(from, to);
degree[to]++;
}
for(int i = 1; i <= n; i++) if(!degree[i]){
dfs(i);
printf("Case %d: %lld\n", kase, dp[i]);
break;
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: