疯子的算法总结(九) 图论中的矩阵应用 Part 2 矩阵树 基尔霍夫矩阵定理 生成树计数 Matrix-Tree
定理:
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相关推荐
- 疯子的算法总结(九) 图论中的矩阵应用 Part 1 POJ3613 Cow Relays
图的存储有邻接矩阵,那么他就具备一些矩阵的性质,设有一个图的demo[100][100];那么demo[M][N]就是M->N的距离,若经过一次松弛操作demo[M][N]=demo[M][K] ...
- 图论 —— 生成树 —— 生成树计数 —— 基尔霍夫矩阵
[概述] Matrix-Tree 定理又称基尔霍夫矩阵树定理,其用于解决:给定 n 个点 m 条边的无向图,求图的生成树个数的问题. 其利用线性代数中矩阵的行列式来进行求解,关于矩阵的行列式:点击这里 ...
- 随笔——基尔霍夫热辐射定律中灰体发射率和吸收率相等的推导逻辑
本文灵感来源于最近我在重新学传热学的课程时,对灰体的发射率和吸收率相等的推导过程阅读时觉得书上有些语焉不详,于是用自己的语言解释了下. 首先,让我们来看课本上关于基尔霍夫(Kirchhoff)定律的定 ...
- 数据结构与算法 / 霍夫曼树、霍夫曼编码和解码
一. 诞生原因 找出存放一串字符所需的最少的二进制编码. 二. 构造方法 首先统计出每种字符出现的频率,即:概率.权值. 例如:频率表 A:60, B:45, C:13 D:69 E ...
- 图论 —— 生成树 —— 生成树计数
[概述] 给出一个由 n 个点和 m 条边构成的简单无向加权图,有时需要对生成树计数或对最小生成树计数. 当对生成树计数时,利用基尔霍夫矩阵的 Matrix-Tree 定理即可解决,而对最小生成树计数 ...
- 数据结构与算法(九)—— 二叉树结构及其实现和应用
因为树结构中的内容较多,所以分开介绍.这篇主要介绍二叉树. 目录 一. 霍夫曼树(Huffman Tree) 1.1 霍夫曼树定义 1.2 霍夫曼树的构造 1.3 霍夫曼算法描述 1.4 霍夫曼树的 ...
- 贪心算法(Greedy Algorithm)之霍夫曼编码
文章目录 1. 贪心算法 2. 应用 2.1 找零钱 2.2 区间覆盖 2.3 霍夫曼编码 霍夫曼编码完整代码 1. 贪心算法 我们希望在一定的限制条件下,获得一个最优解 每次都在当前的标准下做出当下 ...
- Zlib压缩算法:LZ77、LZ78、霍夫曼编码、滑动窗口、Rabin-Karp算法、哈希链、I/O缓冲区
Table of Contents 1.简介 1.1 什么是zlib 2.压缩算法 2.1 放气 2.2 LZ77 2.2.1 滑动窗口 2.2.2 长距离对 2.3 霍夫曼编码 3. zlib的实现 ...
- Python,OpenCV中的霍夫圆变换——cv2.HoughCircles()
Python,OpenCV中的霍夫圆变换 1. 效果图 2. 源码 参考 这篇博客将学习如何使用霍夫圆变换在图像中找到圆圈,OpenCV使用cv2.HoughCircles()实现霍夫圆变换. cir ...
最新文章
- 【大作业】城市地铁线路最短路规划及路径输出(满分)
- nodejs发送数据到html显示_用php生成HTML文件的类
- html表单输入框添加验证码,织梦Dedecms为自定义表单添加验证码功能
- 架构师接龙:百姓网潘晓良VS. 盛大许式伟
- 母亲节刚过,别盲目 high 你的“增长”
- android麻将小项目1:第一天的一些收获
- python数据分析知识点_Python数据分析--Pandas知识点(三)
- LeetCode 459. Repeated Substring Pattern
- 【英语学习】【Level 07】U01 Making friends L5 A friend for a day
- android 溢出按钮,React-Native封裝Tabbar 實現中間按鈕溢出效果(Android/iOS)
- gitlab 项目分支管理的一种策略
- springboot 启动 退出_springboot怎么停止掉服务器 我启动了springboot,但是我修改了程序,我怎么重启啊...
- c# winform 窗体间的传值
- Mybatis工作中常用动态SQL总结
- java 文件读取大全
- 算法逻辑题_二.计算法
- spyder 清屏操作
- 如何使用计算机做海报,用word做的海报步骤_word怎么设计海报
- 行人轨迹预测ETH数据集坐标转换
- 快速入门JavaScript(一)
热门文章
- 其他手机有机会用鸿蒙,即将发布的荣耀50系列手机可以有机会用鸿蒙系统吗?...
- ejabberd登陆不成功的解决方案
- 从0开始的Python学习009参数
- mysql group_concat
- 【python】python 中的三元表达式(三目运算符)
- AngularJS 1.3 支持使用 $digest() 循环实现延迟
- 程序员请注意:异步编程模式已被人注册为专利
- GridView中列表的“双击事件”
- 聚集索引和填充因子fill factor的设置,减少死锁
- Kevin专栏---自定义安装对话框的界面