使用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 现在给出了一个简单无向加权图.你不满足于求出这个图的最小生成树,而希望知道这个图中有多少个不同的最小生成树.(如果两颗最小生成树中至少有一条边不同,则这两个最小生成树就是不同的 ...
随机推荐
- Linux安装 NTFS 支持
my system kernel Version is 2.6.18-128.el5 在这个地址下载了 kernel-module-ntfs-2.6.18-128.el5-2.1.27-0.rr.10 ...
- selenium安装及官方文档
selenium-python官方文档: https://selenium-python.readthedocs.io/ python3.5已安装的情况下,安装示意图如下 命令行输入 pip3 ins ...
- 【HHHOJ】ZJOI2019模拟赛(十四)03.12 解题报告
点此进入比赛 得分: \(50+5+24=79\) 排名: \(Rank\ 2\) \(Rating\):\(+79\) \(T1\):[HHHOJ197]古明地(点此看题面) 基本上全部时间都用来想 ...
- AJAX(三):GET与POST
1.使用场景get是最常见的请求类型,最常用于向服务器查询某些信息仅次于get的是post请求,通常用于向服务器发送应该被保存的数据 2.使用get请求经常会发生一个错误,就是查询字符串的个是有问题, ...
- 20145238-荆玉茗 《Java程序设计》第一次实验报告
实验一 Java开发环境的熟悉(Linux + Eclipse) 实验内容 1.使用JDK编译.运行简单的Java程序: 2.使用Eclipse 编辑.编译.运行.调试Java程序. 实验要求 1.没 ...
- 实现接口Controller定义控制器
实现接口Controller定义控制器 控制器提供访问应用程序的行为,通常通过服务接口定义或注解定义两种方法实现. 控制器解析用户的请求并将其转换为一个模型.在Spring MVC中一个控制器可以包含 ...
- 字节流, FileOutputStream类,FileInputStream类,复制文件,字符流
字节输出流OutputStream OutputStream此抽象类,是表示输出字节流的所有类的超类.操作的数据都是字节 基本方法: 子类可继承调用以上方法 FileOutputStream类 构造方 ...
- jeDate日期控件
http://www.jayui.com/jedate/ 这是日期控件官网,可以去里面下载使用 前台 <%@ Page Language="C#" AutoEvent ...
- 最近的阅读list
fast rcnn 统一了sppnet和rcnn,将原来rcnn分stage的训练合为一个整体的stage,一次完成cls, regression的训练.引入两个loss函数,一个是用来进行cls的, ...
- Python的socket编程
我们知道两个进程如果需要进行通讯最基本的一个前提能能够唯一的标示一个进程,在本地进程通讯中我们可以使用PID来唯一标示一个进程,但PID只在本地唯一,网络中的两个进程PID冲突几率很大,这时候我们需要 ...