zoukankan      html  css  js  c++  java
  • Matrix Tree 定理及证明

    引言

    矩阵树定理是一个基于线性代数工具,解决图上生成树计数相关问题的工具。

    最大的特点之一就是网上很多人都不会证明。

    一些线代基础:矩阵,行列式等。

    为什么要写这个证明呢?周围很多人认为比较浪费时间,一般不考。然而输入感知定理其中的智慧,不仅对于图论、线性代数有了更深入的了解,还可以为思维注入一些新鲜血液,因此对我个人而言不全是浪费时间之举。

    基础定义

    图的关联矩阵

    对于一个 (n) 个点(第 (i) 个点记为 (v_i)),(m) 条边(第 (j) 条边记为 (e_j))的无向图(为方便起见我们在此处暂定一个方向),定义其“关联矩阵” (M) 为:

    [M_{i,j} = egin{cases} 1 & e_j ext{是} v_i ext{的入边} \ -1 & e_j ext{是} v_i ext{的出边} \ 0 & extit{otherwise.} \ end{cases} ]

    显然大小是 (n imes m) 的。

    拉普拉斯(基尔霍夫)矩阵

    拉普拉斯矩阵 (L) 定义为:

    [L_{i,j} = egin{cases} deg v_i & i = j\ - ext{cnt}(v_i, v_j) & i e j end{cases} ]

    其中 (deg v) 表示顶点 (v) 的度数,( ext{cnt}(u,v)) 表示边 (uleftrightarrow v) 的数量。

    拉普拉斯矩阵有一个很好的关于关联矩阵的性质(附证明,(M^T) 表示 (M) 的转置):

    [L = M imes M^T \ L_{i,i} = sum_{k=1}^n M_{i,k}M^T_{k,i} = sum_{k=1}^n M^2_{i,k}=deg v_i \ L_{i,j} = sum_{k=1}^n M_{i,k}M^T_{k,j} = sum_{k=1}^n M_{i,k}M_{j,k}=- ext{cnt}(v_i, v_j) ]

    (M)(M^T) 相乘的意图何在?注意这样直接实现了内积,对于 (i=j) 的情况,只要 (e_k)(v_i) 相连即产生 (1) 的贡献;对于 (i e j) 的情况,如果 (e_k=(i,j)),那么会有 (-1) 的贡献。通过这个性质我们可以实现 (L)(MM^T)​ 之间的互相转换。除此之外,更加深层的目的将在下面提到。

    理论铺垫

    关联矩阵与图性质的关系

    考虑我们最终的目的是选择 (m) 条边中的 (n-1) 条,那么相当于在关联矩阵中“抽出” (n-1) 列。这些列编号的集合记为 (S),记 (M[S])(M) 仅保留列 (S) 得到的矩阵,大小为 (n imes (n-1))(为了方便,如果行比列多,可能以此表示保留行而不是列)。

    方阵更容易研究,考虑将 (M[S]) 的某一行扔掉,是不会丢失信息的;相反扔掉更多的行则会有丢失——这一点还原到原图上就比较显然了。这也反映 (M[S]) 的秩为 (n-1)。设丢掉一行后的矩阵为 (M_0[S]),这个“丢掉一行”在原图上可以理解为忽略生成树的根,由于是无向图,根的实际选择不需要关心,因此说将“某一行扔掉”。

    思考对于一个不合法的情况,那么图中必然有环。于是不难想到环中这些边对应的列向量必然线性相关。换句话说,不满秩。不满秩的一个比较简洁的充要条件是 (det M_0[S] = 0)

    反之如果生成树合法,那么 (det M_0[S]=pm1)。这个不难证,首先对于一个叶子,必然有对应行只有一个非零元素。使对应行消去其他行,然后该非零元素对应的行列都只有其一个非零元素。我们抛掉这一行和这一列,剩下部分仍然可以归纳下去。最后每行只剩下恰好一列上为 (pm 1)。那么行列式值也为 (pm 1)

    柯西-比内(Cauchy-Binet)定理

    (A)(n imes m) 的矩阵,(B)(m imes n) 的矩阵,那么:

    [det (AB)=sum_{Ssubseteq {1, 2, cdots, m}land |S|=n}(det A[S])(det B[S]) ]

    证明?式子太 shit 了先咕了,而且又不是重点,感性理解吧。

    Matrix Tree 定理

    定理内容

    (L_0)(L) 去掉某 (k) 行及第 (k) 列所得的方阵,则该无向图的生成树个数为 (det L_0)

    定理证明

    根据理论基础,证明非常简单:

    [egin{aligned} det L_0 &= det (M_0M_0^T) \ &= sum_{Ssubseteq {1, 2, cdots, m}land |S|=n-1}(det M_0[S])(det M_0^T[S]) \ &= sum_{Ssubseteq {1, 2, cdots, m}land |S|=n-1}(det M_0[S])^2 end{aligned} ]

    其中 (S) 恰好为一个选边方案,如果合法那么 (det^2) 产生 (1) 的贡献,反之没有贡献。

    最后显然就是生成树的个数。

    定理理解

    整个定理比较复杂,内容比较多,然而核心是很明确的。

    首先是 (M_0[S])​ 的行列式为 (pm 1) 当且仅当生成树合法。

    然后借助 Cauchy-Binet 公式中的枚举 (S) 可以完美表示出“枚举边的子集”这一个过程。同时上面 (pm 1) 我们还需要将其转化为 (1),最后 ((det M_0[S])^2) 正是我们想要的。

    Cauchy-Binet 公式中等式的另一边 (det L_0) 简洁且好求,直接根据输入的图即可构造。

    直接看整个定理像是凑出来的,然而仔细理解证明,再去挖掘整个想法便豁然开朗了。

    有向图上的拓展

    一些扯淡

    我个人认为,没有理解 Matrix Tree 定理本质,是不太能讲清楚为什么有向图可以这么简单地拓展的。其中的精髓其实是拉普拉斯矩阵的定义,如何设计才最合适。

    有向图的 Matrix Tree 定理描述

    基于上面的结果,重定义拉普拉斯矩阵:

    [L_{i,j}=egin{cases} deg_{ ext{in}}v_i & i = j\ - ext{cnt}(v_i o v_j) & i e j end{cases} ]

    其中 (deg_ ext{in} u)​ 表示 (u)​ 的入度;( ext{cnt}(u o v))​ 表示有向边 (u o v)​ 的个数。

    (det L_0) 即为外向生成树的个数。

    看起来……有那么点道理?

    有向图中的定理理解

    事实上这里没有什么 (L=MM^T) 了,如果单纯去重定义 (M) 是找不出这样一个 (M)​ 可以满足这个性质凑数上面那个 (L) 的。

    这就需要考虑无向图中这个 (M) 的真实目的。对于合法的 (S)(det M_0[S]=pm 1)((det M_0[S])^2=1),这是关键,那么对于有向图我们也从中入手。

    考虑一个外向树应该有什么性质。在无向图中我们尝试从树最基本的特征如手,这里我们如法炮制:对于外向树的叶子而言,它只有一个入边。观察关联矩阵,该叶子对应的行一定只有一个 (1)​,其他都是 (0)

    还是消元,我们发现只有一行在这一列有一个 (-1)​,即叶子的父亲。这样一直下去,(M_0)​ 会被消成一个单位矩阵,显然 (det =1)​​,注意不同于之前的 (pm 1)​。还有一点,外向树只是 (det =1) 的充分条件但不必要,这里仍然只保证了构成树。

    由于 Cauchy-Binet 公式是帮助我们间接枚举边集用的,实际上不可或缺。我们希望去迎合它,同时在 (det M_0[S]=1) 的基础上再加一个。考虑新设计一个 (n imes m)(D) 矩阵,满足 (det D_0[S]=1)​ 当且仅当​ (S) 构成的图每个点(除了去掉的那一行)都有恰好一条入边——加上这个限制后恰好满足了外向树。

    那么 (D) 的构造如下:

    [D_{i,j} = egin{cases} 1 & e_j ext{是} v_i ext{的入边} \ 0 & extit{otherwise.} \ end{cases} ]

    或许你注意到了:(L=MD^T)​。接下来的步骤大同小异,故 skip。

    结语

    整个定理结论简单,证明过程也许繁杂但也非无迹可寻。不论是无向图还是有向图,其核心思想是类似的。其中利用行列式值和所求的相对应起来,以及利用 Cauchy-Binet 公式中 (S)​ 的枚举这些思想都是具有启发性的。

    本文来自博客园,作者:-Wallace-,转载请注明原文链接:https://www.cnblogs.com/-Wallace-/p/matrix-tree.html

  • 相关阅读:
    iOS 宏(define)与常量(const)的正确使用
    Android中全屏 取消标题栏,TabHost中设置NoTitleBar的三种方法(转)
    如何在 GitHub 建立个人主页和项目演示页面
    Git 使用指南(cmd + gui)
    Google C++ 编码规范(中文版)
    SVN服务器搭建和使用
    演化理解 Android 异步加载图片(转)
    Android之断点续传下载(转)
    Android学习笔记——关于onConfigurationChanged(转)
    (转)Android数据的四种存储方式SharedPreferences、SQLite、Content Provider和File (三) —— SharePreferences
  • 原文地址:https://www.cnblogs.com/-Wallace-/p/matrix-tree.html
Copyright © 2011-2022 走看看