定理:

1.设G为无向图,设矩阵D为图G的度矩阵,设C为图G的邻接矩阵。

2.对于矩阵D,D[i][j]当 i!=j 时,是一条边,对于一条边而言无度可言为0,当i==j时表示一点,代表点i的度。

即:

3.对于矩阵C而言,C表示两点之间是否存在边,当i==j时为一点无边可言为0,即:

4.定义基尔霍夫矩阵J为度数矩阵D-邻接矩阵C,即J=D-C;

5.G图生成树的数量为任意矩阵J的N-1阶主子式的行列式的绝对值。

证明:

伪证明,不是证明基尔霍夫定理,而是讲一下原理,证明超过我们所需要使用的范畴。

首先明确一点就是若图G是一颗树,他的基尔霍夫矩阵的N-1阶行列式的值1;因为是一棵树,所以不含有环,且两点之间就只有一条边相连,任意列任意行只有1,且度数矩阵与之对应密切,一个点的度数只和自己的变数有关,且不与其他边相连,度数和为2*N,边数为N,且能通过高斯消元化为上三角行列式,即讨论J矩阵中能够构成多少个该子树,即为求矩阵N-1阶主子式的行列式,注意任意一个图的J基尔霍夫矩阵的行列式值都为0;

实现方式:

就是求这个行列,行列式求得方法是高斯消元,其实就是将行列式化为上三角行列式,这个那份线性代数里讲的挺清楚的,不要被名字吓到。

bool zero(double a)
{
return a>-eps && a<eps;
}
double Gauss()
{
double mul,Result=1;
int i,j,k,b[n];
for(i=0;i<n;i++) b[i]=i;
for(i=0;i<n;i++){
if(zero(a[b[i]][i]))
for(j=i+1;j<n;j++)
if(!zero(a[b[j]][i])) { swap(b[i],b[j]); Result*=-1; break; }
Result*=a[b[i]][i];
for(j=i+1;j<n;j++)
if(!zero(a[b[j]][i])){
mul=a[b[j]][i]/a[b[i]][i];
for(k=i;k<n;k++)
a[b[j]][k]-=a[b[i]][k]*mul;
}
}
return Result;
}

疯子的算法总结(九) 图论中的矩阵应用 Part 2 矩阵树 基尔霍夫矩阵定理 生成树计数 Matrix-Tree的更多相关文章

  1. 疯子的算法总结(九) 图论中的矩阵应用 Part 1+POJ3613 Cow Relays

    图的存储有邻接矩阵,那么他就具备一些矩阵的性质,设有一个图的demo[100][100];那么demo[M][N]就是M—>N的距离,若经过一次松弛操作demo[M][N]=demo[M][K] ...

  2. 【算法】关于图论中的最小生成树(Minimum Spanning Tree)详解

    本节纲要 什么是图(network) 什么是最小生成树 (minimum spanning tree) 最小生成树的算法 什么是图(network)? 这里的图当然不是我们日常说的图片或者地图.通常情 ...

  3. word2vec 中的数学原理二 预备知识 霍夫曼树

    主要参考:    word2vec 中的数学原理详解                 自己动手写 word2vec 编码的话,根是不记录在编码中的 这一篇主要讲的就是霍夫曼树(最优二叉树)和编码.  ...

  4. 【算法】Matrix - Tree 矩阵树定理 & 题目总结

    最近集中学习了一下矩阵树定理,自己其实还是没有太明白原理(证明)类的东西,但想在这里总结一下应用中的一些细节,矩阵树定理的一些引申等等. 首先,矩阵树定理用于求解一个图上的生成树个数.实现方式是:\( ...

  5. OpenCV中的霍夫线变换和霍夫圆变换

    一.霍夫线变换 霍夫线变换是OpenCv中一种寻找直线的方法,输入图像为边缘二值图. 原理: 一条直线在图像二维空间可由两个变量表示, 例如: 1.在 笛卡尔坐标系: 可由参数: (m,b) 斜率和截 ...

  6. 图论中最优树问题的LINGO求解

    树:连通且不含圈的无向图称为树.常用T表示.树中的边称为树枝,树中度为1的顶点称为树叶. 生成树:若T是包含图G的全部顶点的子图,它又是树,则称T是G的生成树. 最小生成树:设T=(V,E1)是赋权图 ...

  7. ZeroMQ接口函数之 :zmq_z85_decode – 从一个用Z85算法生成的文本中解析出二进制密码

    ZeroMQ 官方地址 :http://api.zeromq.org/4-0:zmq_z85_decode zmq_z85_decode(3)         ØMQ Manual - ØMQ/4.1 ...

  8. 使用 FP-growth 算法高效挖掘海量数据中的频繁项集

    前言 对于如何发现一个数据集中的频繁项集,前文讲解的经典 Apriori 算法能够做到. 然而,对于每个潜在的频繁项,它都要检索一遍数据集,这是比较低效的.在实际的大数据应用中,这么做就更不好了. 本 ...

  9. 相机标定:关于用Levenberg-Marquardt算法在相机标定中应用

    LM算法在相机标定的应用共有三处. (1)单目标定或双目标定中,在内参固定的情况下,计算最佳外参.OpenCV中对应的函数为findExtrinsicCameraParams2. (2)单目标定中,在 ...

随机推荐

  1. Mac系统中安装virtualenv虚拟环境

    总体来说有三个步骤. 1.创建工作目录. python3 -m venv lanyue_env 注意: 2.安装virtualenv. pip3 install --user virtualenv 2 ...

  2. String 对象-->charCodeAt() 方法

    1.定义和用法 获取指定下标的字符的ASCII码(Unicode) 返回值:0~65535之间的整数 语法: string.charCodeAt(index) 参数: index:指定字符的下标 举例 ...

  3. Python设计模式(10)-模板模式

    class DbManager: def insert(self): pass def dele(self): pass class DbManager: def insert(self): pass ...

  4. Python设计模式(2)-策略模式

    # 策略模式和简单工厂模式相比,少了使用switch case 做判断,然后去实例化相应的 # 对象,比简单工厂模式更灵活. 它们代码的区别就在于此处使用了抽象类代替工厂类 # coding=utf- ...

  5. 几行代码实现cookie的盗取

    前言 上一篇文章中介绍了XSS(跨站脚本攻击)简单原理与几种类型.接下来通过实例用几行代码实现cookie的盗取. 正文 这里测试用的工具是DVWA(可以本地搭建,前面文章有介绍),和phpstudy ...

  6. alg-查找只出现一次的数

    //只有2个数出现1次,其余的数都出现2次 class Solution { public: vector<int> singleNumber(const vector<int> ...

  7. Java异常处理总结Exception\Error

    Java异常处理总结Exception\Error 2012-12-28 08:17:17|  分类: JAVA |  标签:java  |举报|字号 订阅   Java异常处理总结          ...

  8. [科普向] Roguelike游戏到底是什么?

    简单的说 Roguelike 是 RPG(角色扮演游戏)的一个分支,也是最重要的一个分支.这个名字源于 1980 年发布的著名电子游戏<Rogue>.按字面上理解,Roguelike 就是 ...

  9. springboot 项目使用阿里云短信服务发送手机验证码

    1.注册阿里云账户进行账号实名认证 2.申请短信签名和模板 3.创建access_key和access_secret 4.然后就是代码编写 一.找到产品与服务里面的云通信模块,然后找到短信服务,开通短 ...

  10. Git敏捷开发--stash命令

    save 执行git stash,默认以commit info保存当前的stash信息 当在某个commit下,执行多次stash时,无法友好地区分每个stash的改动.save 命令可以清晰地标识每 ...