【题目分析】
Matrix-Tree定理+高斯消元
求矩阵行列式的值,就可以得到生成树的个数。
至于证明,可以去看Vflea King(炸树狂魔)的博客
【代码】
#include <cmath> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; #define eps 1e-8 #define maxn 15 double C[maxn][maxn],G[maxn][maxn],A[maxn][maxn]; int tt,n,m,a,b; void Gauss() { double ret=1; for (int i=1;i<n;++i) { for (int j=i+1;j<n;++j) while (fabs(C[j][i])>eps) { double t=C[i][i]/C[j][i]; for (int k=i;k<n;++k) C[i][k]-=t*C[j][k]; for (int k=i;k<n;++k) swap(C[i][k],C[j][k]); ret*=-1; } ret=ret*C[i][i]; } printf("%.0f\n",ret); } int main() { scanf("%d",&tt); while (tt--) { memset(G,0,sizeof G); memset(A,0,sizeof A); memset(C,0,sizeof C); scanf("%d%d",&n,&m); for (int i=1;i<=m;++i) { int a,b; scanf("%d%d",&a,&b); G[a][a]+=1; G[b][b]+=1; A[a][b]=A[b][a]=1; } for (int i=1;i<=n;++i) for (int j=1;j<=n;++j) C[i][j]=G[i][j]-A[i][j]; Gauss(); } }