运用矩阵树定理进行生成树计数

给定一个n个点m条边的无向图,问生成树有多少种可能

直接套用矩阵树定理计算即可

矩阵树定理的描述如下:

首先读入无向图的邻接矩阵,u-v G[u][v]++ G[v][u]++

度数矩阵: u-v D[u][u]++ D[v][v]++;

然后计算图G的基尔霍夫矩阵 C=D-G

接着去掉基尔霍夫矩阵的第i行和第i列(必须都是i,i取任意值)

计算剩下的子矩阵的行列式的值得绝对值即为生成树个数

然后对于有向图来说:

边 u->v G[u][v]++ 然后是D[v][v]++(有向图的度数矩阵指的是入度而不是出度)

这样根据上述步骤计算得来的是树形图的个数

在计算行列式的时候:

先用高斯消元消成上三角矩阵,再把对角线乘起来

(与乘法逆元相关的以后再展开)

下面介绍实现:

const int maxn=15;
int A[maxn][maxn],B[maxn][maxn];
double a[maxn][maxn];
int T,n,m;

B是邻接矩阵,A是度数矩阵

a是基尔霍夫矩阵

我们在读入了n之后n--的目的是直接排除最后一行和最后一列将其变成余子式(是叫这个嘛??)

然后是计算行列式:

void gauss()
{int now=1;for(int i=1;i<=n;i++){int j=now;while(fabs(a[j][now])<eps&&j<=n) j++;if(j==n+1) {puts("0");return;}for(int k=1;k<=n;k++) swap(a[now][k],a[j][k]);for(int j=now+1;j<=n;j++){double t=a[j][now]/a[now][now];for(int k=1;k<=n;k++)a[j][k]-=t*a[now][k];}now++;}double ans=1;if(n&1) ans=-ans;for(int i=1;i<=n;i++) ans*=a[i][i];printf("%.0lf\n",abs(ans));
}

这里的高斯消元是消成上三角矩阵,然后就方便计算det了

完整的实现如下:

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<cmath>
 4 #include<algorithm>
 5 #define eps 1e-8
 6 using namespace std;
 7 const int maxn=15;
 8 int A[maxn][maxn],B[maxn][maxn];
 9 double a[maxn][maxn];
10 int T,n,m;
11 int read()
12 {
13     int x=0,f=1;char ch=getchar();
14     while(ch<'0'||ch>'9') {if(ch=='-')f=-1; ch=getchar();}
15     while(ch>='0'&&ch<='9') {x=x*10+ch-'0';ch=getchar();}
16     return x*f;
17 }
18 void gauss()
19 {
20     int now=1;
21     for(int i=1;i<=n;i++)
22     {
23         int j=now;
24         while(fabs(a[j][now])<eps&&j<=n) j++;
25         if(j==n+1) {puts("0");return;}
26         for(int k=1;k<=n;k++) swap(a[now][k],a[j][k]);
27         for(int j=now+1;j<=n;j++)
28         {
29             double t=a[j][now]/a[now][now];
30             for(int k=1;k<=n;k++)
31                 a[j][k]-=t*a[now][k];
32         }
33         now++;
34     }
35     double ans=1;
36     if(n&1) ans=-ans;
37     for(int i=1;i<=n;i++) ans*=a[i][i];
38     printf("%.0lf\n",abs(ans));
39 }
40 int main()
41 {
42     T=read();
43     while(T--)
44     {
45         memset(A,0,sizeof(A));
46         memset(B,0,sizeof(B));
47         n=read();m=read();
48         n--;
49         for(int i=1;i<=m;i++)
50         {
51             int u=read(),v=read();
52             u--;v--;
53             A[u][u]++;A[v][v]++;
54             B[u][v]++;B[v][u]++;
55         }
56         for(int i=1;i<=n;i++)
57         {
58             for(int j=1;j<=n;j++)
59                 a[i][j]=A[i][j]-B[i][j];
60         }
61         gauss();
62     }
63     return 0;
64 }

转载于:https://www.cnblogs.com/aininot260/p/9426134.html

图论数学:矩阵树定理相关推荐

  1. P3317-[SDOI2014]重建【矩阵树定理,数学期望】

    正题 题目链接:https://www.luogu.com.cn/problem/P3317 题目大意 nnn个点若干条边.告诉你每条边出现的概率,求刚好出现一颗生成树的概率是多少. 解题思路 矩阵树 ...

  2. 学习小记-----行列式矩阵树定理Kirchhoff's theorem

    为什么我的标题要加上Kirchhoff's theorem呢,是因为之前我查这个定理是用这个英文在谷歌上查的,然后,,,,我看了20多分钟的英文维基百科,然后爬墙去做别的题目了QAQ 行列式 前置知识 ...

  3. 行列式入门与矩阵树定理完整证明

    文章目录 前置技能 行列式 定义 性质 拉普拉斯展开 线性性 可乘性 可加性 不重性 可倍加性 转置不变性 可交换性 行可交换性 列可交换性 优化行列式的计算 矩阵树定理 前置定义 一些引理 转置引理 ...

  4. 矩阵树定理2020HDU多校第6场j-Expectation[位运算+期望]

    矩阵树定理 用于求解图上面生成树的个数,生成树的个数等于基尔霍夫矩阵的任何一个N-1阶主子式的行列式的绝对值 矩阵树模板 struct Matrix_Tree {ll a[N][N];Matrix_T ...

  5. Luogu P4336 [SHOI2016]黑暗前的幻想乡(容斥,矩阵树定理,子集反演)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Luogu P4336 [SHOI2016]黑暗前的幻想乡(容斥,矩阵树定理) Problem n≤1 ...

  6. 【学习笔记】矩阵树定理(Matrix-Tree)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 目录 一.矩阵树定理 二.常用定理 三.例题 1. Luogu P6178 [模板]Matrix-Tr ...

  7. [CF917D]Stranger Trees[矩阵树定理+解线性方程组]

    题意 给你 \(n\) 个点的无向完全图,指定一棵树 \(S\),问有多少棵生成树和这棵树的公共边数量为 \(k\in[0,n-1]\) \(n\leq 100\) 分析 考虑矩阵树定理,把对应的树边 ...

  8. HDU多校6 - 6836 Expectation(矩阵树定理+高斯消元求行列式)

    题目链接:点击查看 题目大意:给出一张由 n 个点和 m 条边组成的无向图,对于任意一个生成树,其权值为 n - 1 条边的边权进行二进制的 and 运算,现在需要在图中任意选择一个生成树,问期望权值 ...

  9. Wannafly挑战赛23F-计数【原根,矩阵树定理,拉格朗日插值】

    正题 题目链接:https://ac.nowcoder.com/acm/contest/161/F 题目大意 给出nnn个点的一张图,求它的所有生成树中权值和为kkk的倍数的个数.输出答案对ppp取模 ...

最新文章

  1. BZOJ 4032: [HEOI2015]最短不公共子串(后缀自动机+记忆化搜索)
  2. vue 返回上一页传参_H5页面与微信小程序相互跳转并传参(web-view)
  3. oracle事务数统计,Oracle 查询事务数
  4. 非结构化商业文本中隐私信息识别-第2名方案(含数据)
  5. php api框架 登录验证码,thinkphp3.2 框架如何使用验证码
  6. MATLAB--数字图像处理 频域图像分析
  7. linux服务器中安装SVN,linux服务器安装svn并上传项目
  8. RubyOnRails开发知识链接汇总
  9. Python机器学习:基于西瓜数据集的KNN算法实现
  10. python查火车票_Python查询火车票(三)
  11. android 圆形背景文字,android圆形图片,圆形背景文字的CircleTextImageView开源组件
  12. 微信点餐系统——用Enum枚举来保存商品状态
  13. python if continue的用法_Python continue语句用法实例
  14. java熔断器_详解spring cloud分布式关于熔断器
  15. shouldoverrideurlloading为什么有时候不走_心理学:为什么很多看似不般配的人,往往都能走到最后?...
  16. [开源名人录] Fabrice Bellard
  17. 地方政府不愿房价下跌 救市或化解房地产调控
  18. HTTP Host 字段作用
  19. Gartner发布2022年数据分析十二大趋势:数据和分析将成为创新起源
  20. 6-2 计算长方体的表面积和体积

热门文章

  1. Objective-C:MRC(引用计数器)获得对象所有权的方式(init、retain、copy等)
  2. 【MVC】ASP.Net MVC 4项目升级MVC 5的方法
  3. 沙利文:奢侈品防伪领域RFID技术作用巨大
  4. 利用Perl生成随机复杂密码
  5. Devexpress TreeList控件绑定显示父子节点对像
  6. UITableView 滑动删除
  7. RHEL5.5 安装 oracle 11g
  8. 第25节 典型应用集成技术
  9. [20190401]跟踪dbms_lock.sleep调用.txt
  10. WordPress整站轻松开启HTTPS