給定一棵
DFS 遍歷樹,統計每個節點的葉子孩子數
#include <bits/stdc++.h>
using namespace std;
const int MOD = 1e9+7, MAXN = 100005;
vector<int> g[MAXN];
int fact[MAXN];
int dfs(int u, int fa) {
long long ans = 1;
int son1 = 0, son2 = 0;
for (int v : g[u]) if (v != fa) {
int res = dfs(v, u);
if (!res) return 0;
ans = ans * res % MOD;
if (g[v].size() == 1) son1++;
else son2++;
}
if (son2 > 2) return 0;
if (son2) ans = ans * 2 % MOD;
ans = ans * fact[son1] % MOD;
return ans;
}
int main() {
fact[0] = 1;
for (int i = 1; i < MAXN; i++) fact[i] = 1LL * fact[i-1] * i % MOD;
int T; scanf("%d", &T);
for (int cs = 1; cs <= T; cs++) {
int n; scanf("%d", &n);
for (int i = 1; i <= n; i++) g[i].clear();
for (int i = 1; i < n; i++) {
int u, v; scanf("%d%d", &u, &v);
g[u].push_back(v); g[v].push_back(u);
}
int ans = dfs(1, 0);
if (g[1].size() > 1) ans = 2LL * ans % MOD; // 根節點特殊處理
printf("Case #%d: %d\n", cs, ans);
}
return 0;
}