首页 > 代码库 > 学习笔记::矩阵树定理
学习笔记::矩阵树定理
我很懒惰,没有理解
是这样做的
先计算每个点的度数
a[i][j]=i到j边数*-1
进行高斯消元
最后把对角线乘起来就是答案
#include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; #define eps 1e-9 #define N 20 int n,m; int d[N][N],c[N][N]; double a[N][N]; void gauss() { for(int i=1;i<=n;i++) { for(int j=i;j<=n+1;j++) { if(j==n+1) { printf("0\n"); return; } if(fabs(a[j][i])>eps) { for(int k=i;k<=n;k++) swap(a[j][k],a[i][k]); break; } } for(int j=i+1;j<=n;j++) { double t=a[j][i]/a[i][i]; for(int k=1;k<=n;k++) a[j][k]=a[j][k]-t*a[i][k]; } } double ans=1; for(int i=1;i<=n;i++) ans*=a[i][i]; printf("%.0lf\n",abs(ans)); } int main() { int T; scanf("%d",&T); while(T--) { memset(d,0,sizeof(d)); memset(c,0,sizeof(c)); memset(a,0,sizeof(a)); scanf("%d%d",&n,&m); n--; for(int i=1;i<=m;i++) { int u,v; scanf("%d%d",&u,&v); d[u][u]++; d[v][v]++; c[u][v]++; c[v][u]++; } for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) a[i][j]=d[i][j]-c[i][j]; gauss(); } return 0; }
学习笔记::矩阵树定理
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。