zoukankan      html  css  js  c++  java
  • 矩阵树定理证明 (伪)

    在此之前, 需要知道矩阵与行列式的基本变换, 只要大致了解基本变换即可, 还有线性相关是什么意思

    哦, 还要大致知道矩阵树定理是啥

    (S) 证明

    首先, 先了解一下 关联矩阵, 一个 (n) 个点 (m) 条边的图的关联矩阵 (A) 是一个 (n imes m) 的矩阵

    其中, 行代表点, 列代表边, 是一个很暴力的矩阵

    具体而言, 若 ((x, y) in E), 那么就令 (a_{xy} = 1, a_{yx} = -1), 当然, (a_{xy} = -1, a_{yx} = 1) 也是可以的, 在之后会看到, 这个对我们的求解没有任何影响


    我们要注意到一个事实, 一个有环的图的关联矩阵, 其行列式必然为 (0)

    因为把成环的边拿出来, 对应到矩阵上, 那么这些列线性相关, 我们不妨给环上的边定向, 一条边的首为 (1), 尾为 (-1), 顺次相接拼起来, 可以得到 (0) ( 这个要有线代知识, 不理解就记结论吧 )


    众所周知, (n) 个点的图的一个生成树应该有 (n - 1) 条边, 那么这个生成树实际上也可以用一个 (n imes (n - 1)) 的关联矩阵表示, 我们不妨先研究一下树的关联矩阵, 确切来讲, 是所有 (n imes (n - 1)) 的关联矩阵

    很容易想到, 这个 (n imes (n - 1)) 的关联矩阵, 实际上代表了任意一个 (n) 个点 (n - 1) 条边的图, 它要么是树, 要么会成环

    由于 (n imes (n - 1)) 不是很好看, 我们去掉其中任意一行, 得到一个 ((n - 1) imes (n - 1)) 的矩阵 (D) ( 其实是证明需要, 为了得到好做的行列式 )

    研究矩阵 (D) 行列式的值, 先说结论 (det(D) in {-1, 0, 1})

    对于一个 (n imes n)(D) ( 这是归纳里面的 (n), 注意与上面的 (n) 区分 )

    1. 如果 (D) 代表的这张图 ( 就是原图去掉一个点 ) 里面仍然存在环, 由上面说到的, 显然为 (0), 这也意味着原图不是树

    2. 如果原图有环, 但是去掉该点得到的 (D) 没环, 那么 很容易 想象, (D) 并不是一个联通图, 我们把该点原先所在的任意一个简单环上的点与边拿出来, 设原来有 (m) 个点 / 边, 对矩阵重排 ( 由矩阵的基本变换易知, 这样只改变正负 ) 我们把这个环整体放到左上角, 去掉其中一行后显然会得到一个 ((m - 1) imes m) 的矩阵, 并且这个矩阵的下边全是 (0)

      由行列式公式与鸽巢原理, 为了想办法使行列式有值, 我们在这个 ((m - 1) imes m) 的矩阵中最多选 (m - 1) 个有值的地方, 剩下的那个很不幸必然得选 (0), 所以这种情况下行列式为 (0)

    3. 如果原图是颗树, 那么去掉一行后, 实际上相当于删去了一个点, 显然, 必然会存在一列, 其有且仅有一个 (-1/1), 类比上面 (2) 的过程, 为了使行列式有值, 我们在这一列只能选择一个位置, 当锁定了这个位置后, 这个位置的行和列的其他数都不能选了, 就相当于缩小了问题规模, 将一个 ((n - 1) imes (n - 1)) 的矩阵缩小成了 ((n - 2) imes (n - 2)) 的矩阵, 然后依次类推

      幸运的是, 如果原图是一颗树, 我们最终一定能使其缩小成 (1 imes 1) 的矩阵, 因为考虑实际含义, 每次消去一个点后的局面为森林, 我们可以沿着刚才消去的点所连的边继续消 ( 比较抽象, 形象点讲, 就像是点燃了一个树状的导线, 一直将其烧尽, 细品一下吧 )

      (1 imes 1) 的矩阵其必然为 (-1 / 1), 这缘于我们消去的方式


    上述就很好地将一张 (n imes (n - 1)) 的图与矩阵联系在了一起, 那我们如何实际操作呢 ?

    假设我们有一个 (n) 个点 (m) 条边的关联矩阵, 考虑一个暴力的过程, 就是在 (m) 个列中任意选择 (n - 1) 列, 然后把这些列拼成一个矩阵, 按照上面的方法消去一行, 求行列式的绝对值然后加起来

    上面的这个方法有两个弊端, 一是选择的时间复杂度太大, 二是求取绝对值这一步看起来就很离谱

    然后我们需要用到一个强大的公式 : ( ext{Binet-Cauchy}) 公式

    对于一个 (n imes m) 的矩阵 (A), (m imes n) 的矩阵 (B), (U = [1, m] cap mathbb{N})

    [det (AB) = sum_{S subseteq U, |S| = n} det (A_S) imes det (B_S) ]

    其中 (A_S) 代表取出 (S) 中下标的列组成的矩阵, (B_S) 代表取出 (S) 中下标的行组成的矩阵

    这个菜鸡我暂时还不会证明, 先知道好了

    (n) 个点 (m) 条边的图的 (n imes m) 关联矩阵为 (M)

    如果我们令 (A = M, B = M^T), 选取一个整数 (k in [1, n]), 对 (M) 去掉第 (k) 行, 对 (M^T) 去掉第 (k) 列, 那么原问题的解显然就为 (det (M imes M^T)), 很妙的是, 它同时用平方运算帮我们解决了取绝对值的问题

    现在只用研究 (M imes M^T) 是什么就好了, 令 (G = M imes M^T)

    (g_{ij})(M)(i) 行与 (M^T)(j) 列的点积, 实际上也代表了 (M) 的第 (i) 行与第 (j) 行的点积

    (i = j), 那么由于点积的对应项相同, 显然 (g_{i,i} = ext{deg} (i))

    (i ot = j), 由于一列中的有值的两个位置只可能是 (-1)(1), 乘起来必然为 (-1), 所以 (g_{i, j}) 就代表了 (i)(j) 之间的边的数量


    实际上 (G =) 度数矩阵 (-) 邻接矩阵, 而 (G) 又叫 基尔霍夫矩阵 / 拉普拉斯矩阵

    参考

  • 相关阅读:
    Spring Freamwork 开发初体验
    mybooklist.cn 书单de故事六月十六日
    mybooklist 日志5.12
    我的书单mybooklist
    Bison
    Java学习日记——基础篇(一)常识
    Python学习日记(十)—— 杂货铺(全局变量补充、Python参数传递、字符串格式化、迭代器、生成器)
    Python学习日记(九)—— 模块二(logging、json&pickle、xml、requests、configparser、shutil、subprocess)
    Python学习日记(八)—— 模块一(sys、os、hashlib、random、time、RE)
    Python学习日记(七)——装饰器
  • 原文地址:https://www.cnblogs.com/cssyz-wjj/p/14875874.html
Copyright © 2011-2022 走看看