#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; const int N=55; typedef long long LL; int D[N][N]; LL C[N][N];//Kirchhoff矩阵 LL Det(LL a[][N],int n)//生成树计数:Matrix-Tree定理 { LL ret=1; for(int i=1; i<n; i++) { for(int j=i+1; j<n; j++) while(a[j][i]) { LL t=a[i][i]/a[j][i]; for(int k=i; k<n; k++) a[i][k]=(a[i][k]-a[j][k]*t); for(int k=i; k<n; k++) swap(a[i][k],a[j][k]); ret=-ret; } if(a[i][i]==0) return 0; ret=ret*a[i][i]; } if(ret<0) ret=-ret; return ret; } int main() { //freopen("C:\\Users\\Administrator\\Desktop\\kd.txt","r",stdin); int n,m,k; while(~scanf("%d%d%d",&n,&m,&k)) { memset(C,0,sizeof(C)); memset(D,0,sizeof(D)); int u,v; while(m--) { scanf("%d%d",&u,&v); u--; v--; D[u][v]=D[v][u]=1; } for(int i=0; i<n; i++) { int u=0; for(int j=0; j<n; j++) { if(i!=j&&!D[i][j]) { u++; C[i][j]=-1; } } C[i][i]=u; } LL res=Det(C,n); printf("%lld\n",res); } return 0; }
时间: 2024-10-08 21:52:02