我又把Matrix写错啦


这东西讲课的时候竟然一笔带过了,淦

好吧这东西我不会证

那我们来愉快的看结论吧

啦啦啦

预备工作

你有一个 $ n $ 个点的图

比如说

   5
/|\
/ | \
2--1--3
\ |
\|
4

现在造一个$ n \times n $的矩阵

我们把他叫做$ D $

$ D $的元素有这样的一个规律:

对于某一个$ D_{i,j} $,如果 $ i = j $ ,它就等于点 $ i $ 的度数,否则就为 $ 0 $

那么我们可以yy出D的样子

\[ D=\left[
\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 $

就是邻接矩阵,直接拿来用就可以了

\[ A=\left[
\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 $!

\[ D-A=\left[
\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阶主子式的行列式的绝对值

上面那个是真-结论

你问我什么是行列式?

我们本来写矩阵不是

\[ K=\left[
\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 $时有效)

\[ K=\left|
\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 $ 阶主子式长这样:

\[ tmp=\left|
\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与它的行列式来解决生成树计数问题的更多相关文章

  1. HDU 4305 Lightning Matrix Tree定理

    题目链接:https://vjudge.net/problem/HDU-4305 解法:首先是根据两点的距离不大于R,而且中间没有点建立一个图.之后就是求生成树计数了. Matrix-Tree定理(K ...

  2. 一篇自己都看不懂的Matrix tree总结

    Matrix tree定理用于连通图生成树计数,由于博主太菜看不懂定理证明,所以本篇博客不提供\(Matrix\ tree\)定理的证明内容(反正这个东西背结论就可以了是吧) 理解\(Matrix\ ...

  3. BZOJ.4031.[HEOI2015]小Z的房间(Matrix Tree定理 辗转相除)

    题目链接 辗转相除解行列式的具体实现? 行列式的基本性质. //864kb 64ms //裸的Matrix Tree定理.练习一下用辗转相除解行列式.(因为模数不是质数,所以不能直接乘逆元来高斯消元. ...

  4. 矩阵树定理(Matrix Tree)学习笔记

    如果不谈证明,稍微有点线代基础的人都可以在两分钟内学完所有相关内容.. 行列式随便找本线代书看一下基本性质就好了. 学习资源: https://www.cnblogs.com/candy99/p/64 ...

  5. @总结 - 7@ 生成树计数 —— matrix - tree 定理(矩阵树定理)与 prüfer 序列

    目录 @0 - 参考资料@ @0.5 - 你所需要了解的线性代数知识@ @1 - 矩阵树定理主体@ @证明 part - 1@ @证明 part - 2@ @证明 part - 3@ @证明 part ...

  6. 【证明与推广与背诵】Matrix Tree定理和一些推广

    [背诵手记]Matrix Tree定理和一些推广 结论 对于一个无向图\(G=(V,E)\),暂时钦定他是简单图,定义以下矩阵: (入)度数矩阵\(D\),其中\(D_{ii}=deg_i\).其他= ...

  7. 数学-Matrix Tree定理证明

    老久没更了,冬令营也延期了(延期后岂不是志愿者得上学了?) 最近把之前欠了好久的债,诸如FFT和Matrix-Tree等的搞清楚了(啊我承认之前只会用,没有理解证明--),FFT老多人写,而Matri ...

  8. SPOJ.104.Highways([模板]Matrix Tree定理 生成树计数)

    题目链接 \(Description\) 一个国家有1~n座城市,其中一些城市之间可以修建高速公路(无自环和重边). 求有多少种方案,选择修建一些高速公路,组成一个交通网络,使得任意两座城市之间恰好只 ...

  9. [bzoj1016][JSOI2008]最小生成树计数 (Kruskal + Matrix Tree 定理)

    Description 现在给出了一个简单无向加权图.你不满足于求出这个图的最小生成树,而希望知道这个图中有多少个不同的最小生成树.(如果两颗最小生成树中至少有一条边不同,则这两个最小生成树就是不同的 ...

随机推荐

  1. Laravel Scheduling Package

    Laravel 是在 App\Console\Kernel 类中的 schedule 方法去定义所有的调度任务. iBrand 产品作为一个电商类产品,本身业务需求非常庞大和复杂,全部定义在 sche ...

  2. anaconda和jupyter notebook使用方法

    查看安装的conda版本 conda --version 如果没有安装anaconda,可以从以下链接下载anaconda或者miniconda,两者安装一个就可以了 miniconda大约50M h ...

  3. 搭建vs2010 boost开发环境

    一.编译boost库 第一步:下载boost库,下载地址http://sourceforge.net/projects/boost/files/boost/1.55.0/ 第二部:解压boost库,例 ...

  4. 如何计算并测量ABAP及Java代码的环复杂度Cyclomatic complexity

    代码的环复杂度(Cyclomatic complexity,有的地方又翻译成圈复杂度)是一种代码复杂度的衡量标准,在1976年由Thomas J. McCabe, Sr. 提出. 在软件测试的概念里, ...

  5. 动态数组第k小,Poj(1442)

    题目链接:http://poj.org/problem?id=1442 本来想复制一下,然后直接sort,结果T了. 在网上看了一下,有用两个队列做的,想了半天,没看懂什么意思.后来模拟一边,总算是懂 ...

  6. Spring boot 项目导出可执行jar

    配置文件中添加插件 <plugin> <groupId>org.springframework.boot</groupId> <artifactId>s ...

  7. Linux内存管理 - slab分配器和kmalloc

    本文目的在于分析Linux内存管理机制的slab分配器.内核版本为2.6.31.1. SLAB分配器 内核需要经常分配内存,我们在内核中最常用的分配内存的方式就是kmalloc了.前面讲过的伙伴系统只 ...

  8. 第28章 LTDC—液晶显示中英文—零死角玩转STM32-F429系列

    第28章     LTDC—液晶显示中英文 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/f ...

  9. 第5章 什么是寄存器—零死角玩转STM32-F429系列

    第5章     什么是寄存器 集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/firege 本章参考资料 ...

  10. 前端JavaScript之DOM使用案例

    1.弹出框点击关闭 (这个例子关键自己创建标签以及属性,不是太好想啊,而且作用相对来数也不是太大) <!DOCTYPE html> <html> <head> &l ...