题意:给出n个点,m条边的无向图 n<=100,问该图有多少个生成树(n-1条边的连通图)
对于一个无向图G 它的生成树个数等于其Kirchhoff矩阵任何一个n-1阶主子式的行列式的绝对值
Kirchhoff矩阵=度数矩阵-邻接矩阵
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e3+20;
ll deg[N],C[N][N];
ll det(ll a[][N],int n)
{
ll ret=1;
//n-1阶,去掉0行0列
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]);//a[j][i]化为0
ret=-ret;
}
}
ret=ret*a[i][i];
}
return ret;
}
int main()
{
int t;
cin>>t;
while(t--)
{
memset(deg,0,sizeof(deg));
memset(C,0,sizeof(C));
int n,m;
scanf("%d%d",&n,&m);
int u,v;
while(m--)
{
scanf("%d%d",&u,&v);
u--,v--;
C[u][v]=C[v][u]=-1;//有边为-1,否则为0
deg[u]++,deg[v]++;
}
for(int i=0;i<n;i++)
C[i][i]=deg[i];
cout<<det(C,n)<<endl;
}
return 0;
}