在此之前, 需要知道矩阵与行列式的基本变换, 只要大致了解基本变换即可, 还有线性相关是什么意思
哦, 还要大致知道矩阵树定理是啥
(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) 区分 )
-
如果 (D) 代表的这张图 ( 就是原图去掉一个点 ) 里面仍然存在环, 由上面说到的, 显然为 (0), 这也意味着原图不是树
-
如果原图有环, 但是去掉该点得到的 (D) 没环, 那么
很容易想象, (D) 并不是一个联通图, 我们把该点原先所在的任意一个简单环上的点与边拿出来, 设原来有 (m) 个点 / 边, 对矩阵重排 ( 由矩阵的基本变换易知, 这样只改变正负 ) 我们把这个环整体放到左上角, 去掉其中一行后显然会得到一个 ((m - 1) imes m) 的矩阵, 并且这个矩阵的下边全是 (0)由行列式公式与鸽巢原理, 为了想办法使行列式有值, 我们在这个 ((m - 1) imes m) 的矩阵中最多选 (m - 1) 个有值的地方, 剩下的那个很不幸必然得选 (0), 所以这种情况下行列式为 (0)
-
如果原图是颗树, 那么去掉一行后, 实际上相当于删去了一个点, 显然, 必然会存在一列, 其有且仅有一个 (-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})
其中 (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) 又叫 基尔霍夫矩阵 / 拉普拉斯矩阵