使用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 现在给出了一个简单无向加权图.你不满足于求出这个图的最小生成树,而希望知道这个图中有多少个不同的最小生成树.(如果两颗最小生成树中至少有一条边不同,则这两个最小生成树就是不同的 ...
 
随机推荐
- SQL:获取语句执行时间
			
项目中查看数据库查询语句执行时间,脚本如下: --清除缓存 CHECKPOINT; DBCC DROPCLEANBUFFERS; DBCC FREEPROCCACHE; DBCC FREESYSTEM ...
 - mysql索引长度
			
http://blog.csdn.net/qsc0624/article/details/51335632 大家应该知道InnoDB单列索引长度不能超过767bytes,联合索引还有一个限制是长度不能 ...
 - IOS instancetype的使用好处
			
instancetype的类型表示上,跟id一样,可以表示任何对象类型 instancetype只能用在返回值类型上,不能像 id 一样用在参数类型上 instancetype 比 id 多一个好处 ...
 - POJ-2002 Squares---绕点旋转+Hash
			
题目链接: https://vjudge.net/problem/POJ-2002 题目大意: 有一堆平面散点集,任取四个点,求能组成正方形的不同组合方式有多少. 相同的四个点,不同顺序构成的正方形视 ...
 - 数据库连接-ADO.NET
			
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/huo065000/article/details/25830291 非常早就知道了ADO ...
 - 抽象类和final
			
抽象类: 概念:在继承过程中,形成一个继承金字塔,位于金字塔底部的类越来越具体(强大),位于塔顶的越来越抽象(简单). 关键字 :abstract 抽象类特性: [1]抽象类过于抽象,实例化后无语义 ...
 - Jmeter文件目录,功能简介
			
1.Jmeter文件目录:1)bin文件: Jmeter启动:bin/jmeter.bat Jmeter日志文件:jmeter.log Linux的启动文件:Jmeter.sh Jmeter系统配置文 ...
 - C++之string基本字符系列容器
			
string基本字符系列容器 C语言只提供了一个插入类型用来处理字符, 而对于字符串, 只能通过字符串数组来处理, 显得十分不便. C++STL提供了string基本字符系列容器来处理字符串, 可以把 ...
 - 2017.11.18  C语言的算法分析题目
			
算法分析 1. 选定实验题目,仔细阅读实验要求,设计好输入输出,按照分治法的思想构思算法,选取合适的存储结构实现应用的操作. 2. 设计的结果应在Visual C++ 实验环境下实现并进行调试.(也可 ...
 - 基于java开发的开源代码GPS北斗位置服务监控平台
			
最近在研究位置服务平台,基于全球卫星定位技术(GNSS).互联网技术.空间地理信息技术(GIS).3G/4G无线通信技术,面向全国公众用户建立大容量.实时.稳定的位置信息服务运营平台.实现管理目标的实 ...