• 矩阵树定理学习笔记


    考虑一个经典问题:一个 (n) 个点 (m) 条边的无向连通图 ( m{G}),求这个图的生成树个数。 (n leq 300)


    先给 ( m{G}) 随便定个向(之后的 ( m{G}) 仍然为无向的),然后定义 ( m{G}) 的关联矩阵 ( m{M}) 满足:

    [ m{M}_{i,j} = left { egin{array}{lcl} -1 quad i是 e_j 的起点 \1 quad i是 e_j 的终点 \0 quad otherwise end{array} ight. ]

    显然 ( m{M})(n imes m) 的矩阵,而且第 (i) 行一共有 (deg(i)) 个地方有值,第 (j) 列只有两个地方有值。

    再定义 ( m{G})( m{Laplace}) 矩阵 ( m{L}) 为:

    [ m{L}_{i,j} = left { egin{array}{lcl} -f_{i,j} quad i eq j , i和j之间有f_{i,j}条边 \deg(i) quad i=j end{array} ight. ]

    首先有 ( m{M} m{M}^{ m{T}}= m{L}) , 其中 ( m{M}^{ m{T}}) 表示 ( m{M}) 的转置。
    证明: 考虑 ( m{M}) 的第 (i) 行的向量 ( m{M}_i)( m{M}^{ m{T}}) 的第 (j) 列的向量 ( m{M}_j) 做点乘,分类讨论一下:
    如果 (i = j) ,那么 ( m{M}_i = m{M}_j) 。则点乘第 (k) 维的时,如果 (e_k) 不连接 (i) ,结果为 (0) ;否则为 (1) 。所以 (( m{M} m{M}^{ m{T}})_{i,i} = deg(i))
    如果 (i eq j) ,那么 ( m{M}_{i,k} imes m{M}_{j,k}) 有值时,当且仅当 (e_k) 连接了 (i,j) ,此时值为 (-1) ;否则为 (0) 。因此 (( m{M} m{M}^{ m{T}})_{i,j} = -f_{i,j})

    定义一个矩阵 ( m{M})_0 是 ( m{M}) 去掉任意一行后的新矩阵。
    定义一个关于 ( m{M}_0) 的矩阵 ( m{M}_0[ m{S}])( m{M}_0) 的第 (i_1 , i_2 , cdots i_{n-1}) 个列向量组成的子矩阵。其中 (i_1 , i_2 , i_{n-1} in m{S})( m{S}) 为大小等于 (n-1) 的一个边集。

    现在设原图点集 ( m{V})( m{S}) 构成的子图为 ( m{G_0}) ,若 ( m{G_0}) 不构成生成树,即( m{G_0}) 有环,则 (det( m{M}_0[S]) = 0);否则等于 (±1)
    证明 :假设出现环了,且假设环由 (e_1 , e_2 , cdots e_l) 这些边组成。则容易发现这 (l) 条边对应的列向量是线性相关的。此时的行列式就等于 (0) 。否则就构成生成树了。考虑怎么如果这些边构成了生成树,怎么计算这个矩阵的行列式。首先从叶子开始拓补排序,按照拓补序给行向量排个序。显然与叶子有关的边只有一条,我们把它对应的列向量排到队列里面去。这样的话每个点一定在它所有儿子的后面,当我们排序完所有儿子的边的列向量之后,现在与它相关的边又只有一条了,此时我们还是把它排到队列里去。可以发现像这样排序后第 (i) 行的第 (i+1)~(n-1) 列都是没有值的,此时就把矩阵变成了一个分布在左下的三角矩阵。由于对角线上的元素只可能是 (±1) ,又因为排序时行间交换与列间交换只会对正负造成影响,所以这个矩阵的行列式为 (±1)

    再补充一个 ( m{Binet Cauchy}) 定理

    [det( m{AB})= left{ egin{array}{lcl} 0 quad n>m \det(A)det(B) quad n=m \sum_{| m{S}|=n}det( m{A[S]})det( m{B[S]}) quad n < m end{array} ight. ]

    约定其中 ( m{A}) 是一个 (n imes m) 的矩阵, ( m{B}) 是一个 (m imes n) 的矩阵,( m{A[S]}) 为从 ( m{A}) 中选出编号集合为 ( m{S}) 的行向量组成的矩阵,与之前定义一样; ( m{B[S]}) 为选出列向量,与上面有区别。
    容易发现前两种情况是第三种的特殊情况,因此我们只关注第三种情况。
    这里大概证一下:

    [det(AB) = det left( egin{array}{cc} sum_{k=1}^mA_{1,k}B_{k,1} , cdots , sum_{k=1}^mA_{1,k}B_{k,n} \vdots qquad qquad ddots qquad qquad vdots \sum_{k=1}^mA_{n,k}B_{k,1} , cdots , sum_{k=1}^mA_{n,k}B_{k,n} end{array} ight) ]

    由于行列式是枚举排列,考虑枚举每一列的 (k)

    [=sum_{k_1=1}^mcdotssum_{k_n=1}^m det left( egin{array}{cc} A_{1,k_1}B_{k_1,1} , cdots , A_{1,k_n}B_{k_n,n} \vdots qquad ddots qquad vdots \A_{n,k_1}B_{k_1,1} , cdots , A_{n,k_n}B_{k_n,n} end{array} ight) \=sum_{k_1=1}^mcdotssum_{k_n=1}^m det left( egin{array}{cc} A_{1,k_1} , cdots , A_{1,k_n} \vdots quad ddots quad vdots \A_{n,k_1} , cdots , A_{n,k_n} end{array} ight) prod_{i=1}^nB_{k_i,i} qquad cdots (1) ]

    注意到当存在一个 (k_a=k_b) 时,行列式就为 (0) 了。所以我们对 ( m{A}) 的下标枚举一个不可重集 ({ i_1 , i_2 , cdots , i_n }) ,集合元素都在 ([1,m]) 之间。则现在的 ({ k_1,k_2, cdots k_n }) 对应以一个 ({ i_1 , i_2 , cdots , i_n }) 排序前的序列。注意到排序时一旦有 (i<j,k_i>k_j) ,则 第(k_i)行 会被交换一次,因此交换次数等于逆序对数,也就是 (sigma(k_1,k_2,cdots,k_n)) 。那么:

    [(1)=sum_{1 leq i_1<i_2<cdots<i_nleq m} det left( egin{array}{cc} A_{1,k_1} , cdots , A_{1,k_n} \vdots quad ddots quad vdots \A_{n,k_1} , cdots , A_{n,k_n} end{array} ight) sum_{{ k_1,k_2,cdots,k_n }} (-1)^{sigma(k_1,k_2,cdots,k_n)} prod_{i=1}^nB_{k_i,i} qquad cdots \=sum_{| m{S}|=n}det( m{A[S]})det( m{B[S]}) ]

    证完前面这些引理就很容易证矩阵树定理了。
    类似于 ( m{M_0}) (假设去掉的是第 (i) 行),我们定义一个 ( m{L}_0) 表示去掉 ( m{L}) 的第 (i) 行第 (i) 列后的新矩阵。显然有 ( m{M_0} m{M_0}^{ m{T}}= m{L}_0)。则

    [生成树个数=det( m{L}_0) ]

    证明

    [det( m{L}_0) = det( m{M_0} m{M_0}^{ m{T}})\ =sum_{|S|=n-1}det( m{M_0}[ m{S}])det( m{M_0}^{ m{T}}[ m{S}])\ =sum_{|S|=n-1}det( m{M_0}[ m{S}])^2 ]

    然后我们又知道,当 ( m{S}) 对应的边集成环时行列式为 (0) ,否则为 (±1) 。因此 (sum_{|S|=n-1}det( m{M_0}[ m{S}])^2) 就等于生成树个数。
    至此我们将生成树计数转化为了计算行列式,就可以做到 (mathcal{O} (n^3)) 了。


    拓展 :有向图的有根生成树计数。
    有根外向树
    由于是有向图,我们不需要先给 ( m{G}) 定向,直接用原图的方向构造关联矩阵 ( m{M}) 即可。再构造一个 入度矩阵 ( m{D}) ,如果第 (i) 条边连接 (x ightarrow y) ,则令 ( m{D}_{y,i}=1)。再构造有向图的外向 ( m{Laplace}) 矩阵 ( m{L}) ,与无向图情况的定义相同。
    可以类似地将无向图的引理对应过来:
    首先有 ( m{MD^T=L}) 。然后给 ( m{M})( m{D}) 去掉第 ( m root) 行形成 ( m{M_0,D_0})( m root) 为根),考虑 ( m{M_0[S]}) ,发现如果成环了或者有边连向 ( m root) 行列式就为 (0) ,否则为 (±1) ;同样地观察 ( m{D_0[S]}) ,发现如果不连通且未成环,行列式也为 (0) ,因为存在入度为 (0) 的点,否则行列式为 (1)
    仿照无向图的证明过程,我们把 ( m L) 的第 ( m root) 行和第 ( m root) 列去掉形成 ( m L_0) ,仍然有 ( m L_0 = M_0D_0^T) ,那么把 ( m L_0) 的行列式用 ( m BinetCauchy) 定理展开就可以得到 ( m L_0) 的行列式等于以 ( m root) 为根的外向生成树个数。
    有根内向树
    类似于外向的情况,只不过要给 ( m M) 乘个 (-1) 的系数,把 ( m D) 改成出度矩阵即可。其余的证明因为太相似所以略过。

  • 相关阅读:
    进程线程模型
    操作系统运行机制
    操作系统概论
    排序
    win32消息机制
    win32框架
    map
    deque & list
    vector内部实现2
    蓝桥杯 文化之旅 图论 待复习
  • 原文地址:https://www.cnblogs.com/akura/p/14584915.html
Copyright © 2020-2023  润新知