matrixtree定理裸体,学了行列式的n^3解法,(应该是能应用于所有行列式);
代码是参考某篇题解的。。。
#include<iostream> #include<cstring> #include<cmath> #include<cstdio> #include<algorithm> using namespace std; typedef long long ll; int ss,x,y,T,n,m,du[15]; ll g[15][15]; double ans,c[15][15],d[15][15]; bool zero(double x){return (x>0?x:-x)<1e-15;} double guass(){ int i,j,k; ss=0;ans=1; for(i=1;i<n;++i) for(j=1;j<n;++j)d[i][j]=c[i][j]; for(i=1;i<n;++i){ if(zero(d[i][i])){ for(j=i+1;j<n;++j) if(!zero(d[j][i]))break; if(j==n)return 0; for(k=i;k<n;++k)swap(d[i][k],d[j][k]); ss++; } ans*=d[i][i]; for(int k=i+1;k<n;++k)d[i][k]/=d[i][i]; for(int j=i+1;j<n;++j) for(int k=i+1;k<n;++k) d[j][k]-=d[j][i]*d[i][k]; } return abs(ans); } int main(){ cin>>T; while(T--){ memset(g,0,sizeof(g)); memset(c,0,sizeof(c)); memset(du,0,sizeof(du)); cin>>n>>m; for(int i=1;i<=m;++i){ scanf("%d%d",&x,&y); g[x][y]=g[y][x]=1; du[x]++;du[y]++; } for(int i=1;i<=n;++i)c[i][i]=du[i]; for(int i=1;i<n;++i) for(int j=1;j<n;++j){ c[i][j]=c[i][j]-g[i][j]; } printf("%0.0lf ",guass()); } system("pause"); return 0; }