使用Matrix-tree与它的行列式来解决生成树计数问题
我又把Matrix写错啦
这东西讲课的时候竟然一笔带过了,淦
好吧这东西我不会证
那我们来愉快的看结论吧
啦啦啦
预备工作
你有一个 $ n $ 个点的图
比如说
5
/|\
/ | \
2--1--3
\ |
\|
4
现在造一个$ n \times n $的矩阵
我们把他叫做$ D $
$ D $的元素有这样的一个规律:
对于某一个$ D_{i,j} $,如果 $ i = j $ ,它就等于点 $ i $ 的度数,否则就为 $ 0 $
那么我们可以yy出D的样子
\begin{matrix}
4 & 0 & 0 & 0 & 0 \\
0 & 2 & 0 & 0 & 0 \\
0 & 0 & 3 & 0 & 0 \\
0 & 0 & 0 & 2 & 0 \\
0 & 0 & 0 & 0 & 3 \\
\end{matrix}
\right]
\]
除此之外我们还需要一个矩阵$ A $
就是邻接矩阵,直接拿来用就可以了
\begin{matrix}
0 & 1 & 1 & 1 & 1 \\
1 & 0 & 0 & 0 & 1 \\
1 & 0 & 0 & 1 & 1 \\
1 & 0 & 1 & 0 & 0 \\
1 & 1 & 1 & 0 & 0 \\
\end{matrix}
\right]
\]
Now I have a D
I have an A
Ah~
$ D - A $!
\begin{matrix}
4 & -1 & -1 & -1 & -1 \\
-1 & 2 & 0 & 0 & -1 \\
-1 & 0 & 3 & -1 & -1 \\
-1 & 0 & -1 & 2 & 0 \\
-1 & -1 & -1 & 0 & 3 \\
\end{matrix}
\right]
\]
依照数学的一贯尿性习惯
我们把$ D - A $起个名字吧
叫做鸡儿hop夫基尔霍夫Kirchhoff矩阵K,$ K = D - A $
关于行列式
对于一个无向图 G ,它的生成树个数等于其基尔霍夫Kirchhoff矩阵任何一个N-1阶主子式的行列式的绝对值
上面那个是真-结论
你问我什么是行列式?
我们本来写矩阵不是
\begin{matrix}
4 & -1 & -1 & -1 & -1 \\
-1 & 2 & 0 & 0 & -1 \\
-1 & 0 & 3 & -1 & -1 \\
-1 & 0 & -1 & 2 & 0 \\
-1 & -1 & -1 & 0 & 3 \\
\end{matrix}
\right]
\]
的么
我们把$ [ ] $换成 $ | | $ 就好了
(这可能不符合数学的严谨性)
(只在矩阵$ n = m $时有效)
\begin{matrix}
4 & -1 & -1 & -1 & -1 \\
-1 & 2 & 0 & 0 & -1 \\
-1 & 0 & 3 & -1 & -1 \\
-1 & 0 & -1 & 2 & 0 \\
-1 & -1 & -1 & 0 & 3 \\
\end{matrix}
\right|
\]
你问我什么是$ x $阶主子式?
就在 $ [1,n] $ 里面随便选个数 $ p $ ,选 $ (n-x) $ 次,把行列式里面的第 $ p $ 行和第 $ p $ 列同时删掉就好了
比如 $ K $ 的某个 $ n - 1 $ 阶主子式长这样:
\begin{matrix}
4 & -1 & -1 & -1 \\
-1 & 2 & 0 & 0 \\
-1 & 0 & 3 & -1 \\
-1 & 0 & -1 & 2 \\
\end{matrix}
\right|
\]
行列式求值的问题
行列式的值记为$ det(A) $
方法你们都看过了
就是
- 枚举 $ [1,n] $ 的所有排列,把它叫做 $ b $
- 把 $ b $ 的逆序对数量求出来叫做 $ r $
- 然后 $ det(A) = \sum (-1)^{r}\times A_{1,b_{1}}\times A_{2,b_{2}}\times ... \times A_{n,b_{n}} $
不过这样的复杂度肯定非常高
但我们有一种更好的方法
我们可以利用行列式的这些性质:
- 行列式 $ A $ 中某行/列用同一数 $ k $ 乘,其det结果等于 $ kA $
- 行列式 $ A $ 的det等于其转置行列式 $ A^T $ 的( $ A^T $ 的第i行为 $ A $ 的第i列)
- 行列式 $ A $ 中两行/列互换,其det会变成原来的相反数。
- 把行列式 $ A $ 的某行/列中各个数同乘一数后加到另一行/列中各对应数上,结果不会变
- 行列式中某行/列有公因子,这个公因子可以提到行列式外面去
来把行列式变成上三角行列式(其实下三角也一样)
至于怎么用我们亲爱的C++来写这东西
实现起来就是这个样子(*内部写了取模)
typedef long long lint;
const int _ = 202;
lint deter(lint a[_][_],int n,lint mo)
{
register int i,j,k;
register lint tmp,ans=1;
for(i=1;i<=n;i++)for(j=1;j<=n;j++)a[i][j]%=mo;
for(i=1;i<=n;i++)
{
for(j=i+1;j<=n;j++)
{
while(a[j][i]!=0)
{
tmp=a[i][i]/a[j][i];
for(k=1;k<=n;k++)a[i][k]=(a[i][k]-a[j][k]*tmp+mo)%mo;
swap(a[i],a[j]),ans=-ans;
}
}
ans=(ans*a[i][i]+mo)%mo;
if(ans==0)return 0;
}
return (ans+mo)%mo;
}
使用Matrix-tree与它的行列式来解决生成树计数问题的更多相关文章
- HDU 4305 Lightning Matrix Tree定理
题目链接:https://vjudge.net/problem/HDU-4305 解法:首先是根据两点的距离不大于R,而且中间没有点建立一个图.之后就是求生成树计数了. Matrix-Tree定理(K ...
- 一篇自己都看不懂的Matrix tree总结
Matrix tree定理用于连通图生成树计数,由于博主太菜看不懂定理证明,所以本篇博客不提供\(Matrix\ tree\)定理的证明内容(反正这个东西背结论就可以了是吧) 理解\(Matrix\ ...
- BZOJ.4031.[HEOI2015]小Z的房间(Matrix Tree定理 辗转相除)
题目链接 辗转相除解行列式的具体实现? 行列式的基本性质. //864kb 64ms //裸的Matrix Tree定理.练习一下用辗转相除解行列式.(因为模数不是质数,所以不能直接乘逆元来高斯消元. ...
- 矩阵树定理(Matrix Tree)学习笔记
如果不谈证明,稍微有点线代基础的人都可以在两分钟内学完所有相关内容.. 行列式随便找本线代书看一下基本性质就好了. 学习资源: https://www.cnblogs.com/candy99/p/64 ...
- @总结 - 7@ 生成树计数 —— matrix - tree 定理(矩阵树定理)与 prüfer 序列
目录 @0 - 参考资料@ @0.5 - 你所需要了解的线性代数知识@ @1 - 矩阵树定理主体@ @证明 part - 1@ @证明 part - 2@ @证明 part - 3@ @证明 part ...
- 【证明与推广与背诵】Matrix Tree定理和一些推广
[背诵手记]Matrix Tree定理和一些推广 结论 对于一个无向图\(G=(V,E)\),暂时钦定他是简单图,定义以下矩阵: (入)度数矩阵\(D\),其中\(D_{ii}=deg_i\).其他= ...
- 数学-Matrix Tree定理证明
老久没更了,冬令营也延期了(延期后岂不是志愿者得上学了?) 最近把之前欠了好久的债,诸如FFT和Matrix-Tree等的搞清楚了(啊我承认之前只会用,没有理解证明--),FFT老多人写,而Matri ...
- SPOJ.104.Highways([模板]Matrix Tree定理 生成树计数)
题目链接 \(Description\) 一个国家有1~n座城市,其中一些城市之间可以修建高速公路(无自环和重边). 求有多少种方案,选择修建一些高速公路,组成一个交通网络,使得任意两座城市之间恰好只 ...
- [bzoj1016][JSOI2008]最小生成树计数 (Kruskal + Matrix Tree 定理)
Description 现在给出了一个简单无向加权图.你不满足于求出这个图的最小生成树,而希望知道这个图中有多少个不同的最小生成树.(如果两颗最小生成树中至少有一条边不同,则这两个最小生成树就是不同的 ...
随机推荐
- 最近项目需要用到AdminLTE,所以整理一份中文版的小教程
先介绍一下AdminLTE的官方网站:AdminLTE官方网站 和GitHub:AdminLTE的github,可以在上面自行下载. AdminLTE 是一个完全响应管理模板,主要依赖于 Bootst ...
- 如何在windows下安装配置pyspark notebook
第一步:安装anaconda anaconda自带一系列科学计算包 下载链接:http://pan.baidu.com/s/1b4jWlg 密码:fqq3 接着配置环境变量:如我安装在D盘下 试一 ...
- nodejs+MQTT协议实现远程主机控制
摘抄自百度:MQTT(MessageQueuing Telemetry Transport,消息队列遥测传输)是IBM开发的一个即时通讯协议,有可能成为物联网的重要组成部分. 所谓物联网,就是“万物互 ...
- My First Blog in Cnblogs
终于打算从csdn搬到博客园了 虽然在csdn只写过三篇文章,不过打算写第四篇的时候发现原先的三篇都消失了.联系客服最终还是找回了,不过对于csdn神奇的管理方式还是不放心,也没在csdn上再写过文章 ...
- 使用ABAP代码创建S/4HANA里的Sales Order
下图是使用ABAP代码创建的S/4HANA的Sales Order的截图: 其中红色区域的值是我代码里硬编码的,而蓝色是函数SD_SALESDOCUMENT_CREATE自己创建的. 来看下代码: D ...
- while循环小例
# 使用while 循环输入 1 2 3 4 5 6 8 9 10 n = 1 while n <= 10: if n == 7: pass else: print(n) n = n + 1 # ...
- 反射java
所谓反射(Refection),其实就是程序自己能够检查自身信息,就像程序会通过镜子反光来看自己本身一样.反射使得 Java语言具有了“动态性”,即程序首先会检查某个类中的方法.属性等信息,然后再动态 ...
- Codeforces Round #404 (Div. 2) ABC
A. Anton and Polyhedrons Anton's favourite geometric figures are regular polyhedrons. Note that ther ...
- jsc
之前发现一个神器,js代码测试脱离浏览器,mac终端也可以做到 调试js的时候,一般都是用浏览器的开发者工具,这里给大家推荐另外一种,抛开浏览器,在终端执行的方式,Mac内置了一个javascript ...
- Docker中的三个基本概念容器(container)、镜像(image)和仓库(registry)之间有什么关系?
Docker镜像是一个特殊的文件系统,除了提供容器运行时所需的程序.库.资源.配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷.环境变量.用户等).镜像不包含任何动态数据,其内容在构建之 ...