使用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 现在给出了一个简单无向加权图.你不满足于求出这个图的最小生成树,而希望知道这个图中有多少个不同的最小生成树.(如果两颗最小生成树中至少有一条边不同,则这两个最小生成树就是不同的 ...
随机推荐
- 2019.03.15 ZJOI2019模拟赛 解题报告
得分: \(20+45+15=80\)(三题暴力全写挂...) \(T1\):Lyk Love painting 首先,不难想到二分答案然后\(DP\)验证. 设当前需验证的答案为\(x\),则一个暴 ...
- 找父节点和子节点个数(Poj1634)
题目链接:http://poj.org/problem?id=1634 思路:按照工资从小到大排好,找到最近的那个身高较高的人. 有一点要注意的是,这里有个根节点,大boss,他的id是0,因此,我这 ...
- 1012: A MST Problem
1012: A MST Problem 时间限制: 1 Sec 内存限制: 32 MB提交: 63 解决: 33[提交][状态][讨论版][命题人:外部导入] 题目描述 It is just a ...
- 2017.11.5 Java Web ----案例:数据库访问JavaBean的设计
(12)案例----数据库访问JavaBean的设计 例题:数据库操作在一个Web应用程序中的后台处理中占有大比重,设计一组JavaBean封装数据库的基本操作供上层模块调用,提高程序的可移植性. [ ...
- EasyHook实用指南
所谓实用指南就是全是干货,没那么多虚头巴脑的东西,真正要用的人会发现对自己有用的东西,浅尝辄止的人看起来会不知所云. FileMon自己实做的过程中遇到的问题: 1. exe和dll文件必须强命名,对 ...
- VMWare关闭beep声
在虚拟机文件夹下找到 .vmx 文件,在文件末尾添加 mks.noBeep = "TRUE" ,重启虚拟机即可.
- Search in Rotated Sorted Array——LeetCode
Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand. (i.e. ...
- EL 和 JSTL 的使用
EL Express Language 表达式语言 就是把<% 这里可以写java语言 %> 这种jsp的写法简化变为${ }的方式 例如 action="${pageConte ...
- class 类 this指向的问题
ES6 实现了类的概念 class Prosen { } ES5使用函数模拟 function Prosen() { } ES6中的 class定义一个类, 其内部包含 constructor构造函数 ...
- vscode + leetcode +github 同步
1.用VScode打开本地leetcode文件夹 C:\Users\Administrator\.leetcode 2.上传到本地git库 3.打开github桌面,上传到远程库