标签:
#include <iostream> #include <algorithm> #include <cstring> #include <cstdio> #include <vector> using namespace std; const int N=100005; const long long MOD=1e9+7; vector<int>g[N]; long long A[N],res; int dfs(int u, int f) { int nt=0;///包含根节点的所有节点,直接孩子节点,子树个数 int n=g[u].size(); int ns=n-1; if(u==1) ns++; for(int i=0;i<n;i++) { int v=g[u][i]; if(v==f) continue;///防止相邻的两个节点上下反复递归; int num=dfs(v,u); if(num>1) nt++; } if(nt>2)///有大于两个子树不能使切割后连续 return res =0; if(nt)///有一个或两个子树切割方法数都只有两个 res=res*2%MOD; res=res*A[ns-nt]%MOD;///当有多个(非子树的)节点可自由排序; return ns+1; } int main() { A[0]=1; for (int i=1;i<N;i++) A[i]=A[i-1]*i%MOD; int t,cas=1,n; scanf("%d",&t); while(t--) { scanf("%d",&n); for(int i=0;i<=n;i++) g[i].clear(); for(int i=0;i<n-1;i++) { int a,b; scanf("%d%d",&a,&b); g[a].push_back(b); g[b].push_back(a); } if(n==1) { printf("Case #%d: 1\n",cas++); continue; } res=1; dfs(1,0); printf("Case #%d: %lld\n",cas++,res*2%MOD);//根节点左右两种切法 } return 0; }
标签:
原文地址:http://www.cnblogs.com/chen9510/p/5350145.html