Matrix-Tree 定理(基尔霍夫矩阵树定理)求图生成树个数
Matrix-Tree 定理作用:给定 n 个点 m 条边的无向图,求图的生成树个数。
定义矩阵K[i][j]=D[i][j]-A[i][j],(其中D为度数矩阵(即当i==j时,D[i][j]=节点 i 的度数,其余为0),A为邻接矩阵,有边相邻即为1,其余为0)
结论:对于已经得出的基尔霍夫矩阵,去掉其随意一行一列得出的矩阵的行列式,其绝对值为生成树的个数
注:行列式的绝对值:先用高斯消元消成上三角矩阵,把对角线乘起来
文章:https://wenku.baidu.com/view/872eb02de2bd960590c677c6.html
LL K[N][N]; LL gauss(int n){//求矩阵K的n-1阶顺序主子式 LL res=1; for(int i=1;i<=n-1;i++){ for(int j=i+1;j<=n-1;j++){ while(K[j][i]){ int t=K[i][i]/K[j][i]; for(int k=i;k<=n-1;k++) K[i][k]=(K[i][k]-t*K[j][k]+MOD)%MOD; swap(K[i],K[j]); res=-res; } } res=(res*K[i][i])%MOD; } return (res+MOD)%MOD; } int main(){ int n,m; scanf("%d%d",&n,&m); memset(K,0,sizeof(K)); for(int i=1;i<=m;i++){ int x,y; scanf("%d%d",&x,&y); K[x][x]++; K[y][y]++; K[x][y]--; K[y][x]--; } printf("%lld\n",gauss(n)); return 0; }