在矩阵A中取出第i1,i2,…,ip行第j1,j2,…,jp列的交叉元素,按原来的次序排成p阶矩阵。
这个矩阵的行列式称为矩阵A的p阶子式,记作
根据这个定义,下面我们再介绍中一个非常重要的公式——Binet-Cauchy公式。
定理8(Binet-Cauchy公式)设A和B各为p*q及q*p矩阵,则有
特别的,detAAT=(detA)2。
新的方法
介绍
下面我们介绍一种新的方法——Matrix-Tree定理(Kirchhoff矩阵-树定理)。
Matrix-Tree定理是解决生成树计数问题最有力的武器之一。
它首先于1847年被Kirchhoff证明。
在介绍定理之前,我们首先明确几个概念:
1、G的度数矩阵D[G]是一个n*n的矩阵,并且满足:
当i≠j时,dij=0;当i=j时,dij等于vi的度数。
2、G的邻接矩阵A[G]也是一个n*n的矩阵,并且满足:
如果vi、vj之间有边直接相连,则aij=1,否则为0。
我们定义G的Kirchhoff矩阵(也称为拉普拉斯算子)C[G]为C[G]=D[G]-A[G],则Matrix-Tree定理可以描述为:
G的所有不同的生成树的个数等于其Kirchhoff矩阵C[G]任何一个n-1阶主子式的行列式的绝对值。
所谓n-1阶主子式,就是对于r(1≤r≤n),将C[G]的第r行、第r列同时去掉后得到的新矩阵,用Cr[G]表示。
下面我们举一个例子来解释Matrix-Tree定理。
如图a所示,G是一个由5个点组成的无向图。
图a
根据定义,它的Kirchhoff矩阵C[G]为
我们取r=2,则有:
这11棵生成树如图b所示。
图b
这个定理看起来非常“神奇”,只需要计算一个矩阵的行列式,就可以得到这个图不同的生成树的个数!
这是为什么呢?
让我们尝试着来证明一下吧。
证明
我们不难看出,这个定理的关键是图的Kirchhoff矩阵。
这个矩阵有什么特殊的性质呢?
经过分析,我们可以发现:
1、对于任何一个图G,它的Kirchhoff矩阵C的行列式总是0。
这是因为C每行每列所有元素的和均为0。
2、如果G是不连通的,则它的Kirchhoff矩阵C的任一个主子式的行列式均为0。
证明:
如果G中存在k(k>1)个连通分量G1,G2,…,Gk,那么,我们可以重新安排C的行和列使得属于G1的顶点首先出现,然后是G2……。
回忆行列式的性质2,设我们一共进行了t次行交换,显然,我们同样需要进行t次列交换。
因此,我们总共进行了2t次交换,所以,行列式的符号没有改变。
重新安排后的矩阵如下图所示:
带方框的Gi表示了C[Gi]。
注意在方框以外的地方都是0因为任意两个连通分量之间没有边相连。
设r是第i个连通分量中的第j个顶点,那么
3、如果G是一颗树,那么它的Kirchhoff矩阵C的任一个n-1阶主子式的行列式均为1。
证明:
为了证明这条重要的性质,我们通过不断的变换Cr[G]从而得到一个上三角矩阵并且使得主对角线上所有的数字都是1。
第一步:
我们把所有的顶点按照在树上离vr的距离从近至远排列。
首先是vr,然后是离vr距离为1的点,接下来是离vr距离为2的点……。
距离相同的点可以任意排列。
我们按照这个顺序将所有的定点重新编号。
同时,把以r为根的有根树上vi的父结点vj称为vi的父亲,显然,在刚才得到的顺序中,vj出现在vi之前。
第二步:
将Cr[G]的n-1行和n-1列按照刚才得到的顺序重新排列。
因为行列都需要交换,所有总交换次数是偶数,Cr[G]的行列式不边。
第三步:
按照刚才得到的顺序的逆序处理,对于每个i,如果vi的父亲vj不等于vr,则把第i列加到第j列上去。
这样处理过之后,我们来看一下现在的Cr[G]是否和我们的希望相同。
我们通过归纳法来证明。
显然,最后一列符合要求,因为最后一个点只和它的父亲之间有边,它的度为1。
假设当前处理的是第i列,并且第i+1至第n-1列都符合要求。
我们设vi的父亲是vj,它有k个孩子
,显然,只有第i1,i2,…,ik列才会加到第i列上来。
所有这些列,都在第i行有个-1而在对角线上有个1,而第i列在第j、i1,i2,…,ik行上为-1而在第i行上为k+1。
每一列加上来的时候,第i行第i列减一同时与之相对的那一列加一变为0。
最后第第i行第i列变为1,第i1,i2,…,ik行变为0。
也就是说,最后Cr[G]会变成上三角矩阵并且主对角线上所有的数字都是1。
这就证明了我们的结论。
在证明Matrix-Tree定理的过程中,我们使用了无向图G的关联矩阵B。
B是一个n行m列的矩阵,行对应点而列对应边。
B满足,如果存在一条边e={vi,vj},那在e所对应的列中,vi和vj所对应的那两行,一个为1、另一个为-1,其他的均为0。
至于谁是1谁是-1并不重要,如下图所示。
接下来,我们考察BBT。
容易证明,(BBT)ij等于B的第i行与第j列的点积。
所以,当i=j时,(BBT)ij等于与vi相连的边的个数,即vi的度数;而当i≠j时,如果有一条连接vi、vj的边,则(BBT)ij等于-1,否则等于0。
这与Kirchhoff矩阵的定义完全相同!
因此,我们得出:
C=BBT!
也就是说,我们可以将C的问题转化到BBT上来,这样做有什么用呢?
设Br为B去掉第r行后得到的新矩阵,易知Cr=BrBrT。
根据Binet-Cauchy公式,我们可以得到:
是把Br中属于x的列抽出后形成的新矩阵。
我们注意到,当x中的边形成环时,总有
。
例如,如果新图中存在一个大小为3的环,那么我们可以重新安排
如下图所示:
这样,
等于左上角3阶子式的行列式乘以右下角n-4阶矩阵的行列式。
而左上角的3阶子式是退化的,它每行每列的和都是0。
因此
也等于0。
类似的证明可以推广到环的大小任意的情况。
显然,
可以看成是仅由所有的顶点和属于x的边构成的新图的Kirchhoff矩阵的一个n-1阶主子式。
根据图的Kirchhoff矩阵的性质,如果将所有属于x的n-1条边加入图中后形成一颗树,那么
为1;而如果没有形成树,则必然存在一个环,那么
。
也就是说,我们考察边集所有大小为n-1的子集,如果这个子集中的边能够形成一颗树,那么我们的答案加1,否则不变。
这就恰好等于原图生成树的个数!
因此,我们成功地证明了Matrix-Tree定理!
如果图中有重边,Matrix-Tree定理同样适用,具体的证明方法类似,请读者自己思考。
因为计算行列式的时间复杂度为O(n3),因此,生成树的计数也可以在O(n3)的时间内完成。
理解
刚才的分析可能有些“深奥”,下面让我们从直观上来理解一下这个定理。
我们首先来看一道简单的数学问题:
试求方程
所有非负整数解的个数。
这是我们大家都很熟悉的一道组合计数问题。
我们通常的做法是设有2个1和两个△,我们将这4个元素任意排列,那么不同的排列的个数就等于原方程解的个数,即
。
为什么要这样做呢?
我们将所有6种排列列出后发现,一种排列就对应了原方程的一个解:
△△11对应x1=0,x2=0,x3=2;
△1△1对应x1=0,x2=1,x3=1;
△11△对应x1=0,x2=2,x3=0;
……
也就是说,我们通过模型的转化,找出了原问题和新问题之间的对应关系,并利用有关的数学知识解决了转化后的新问题,也就同时解决了原问题。
这种转化的重要意义在于:
在不同问题之间的架起了互相联系的桥梁。
回到我们讨论的Matrix-Tree定理上来。
我们同样是经过模型的转化后(将图模型转化为矩阵模型),发现Binet-Cauchy公式展开式中的每一项对应着边集一个大小为n-1的子集。
其中,值为1的项对应一颗生成树,而没有对应生成树的项值为0。
这样,将问题转化为求展开式中所有项之和。
再利用已有的数学知识,就可以成功解决这个问题。
我们将这两个问题进行对比,可以发现:
在第一个问题中,方程的解所扮演的角色与图的生成树在第二问题中所扮演的角色类似;而第一个问题中排列方案所扮演的角色与第二个问题中展开式中的每一项所扮演的角色相同。
同时,在每个问题中,两个对象之间又是互相对应的。
这两个问题的不同之处仅仅在于:
相互之间的对应关系更加隐蔽、复杂,需要更加强大的数学理论来支撑。
具体应用
下面我们通过几道例题来看一下生成树的计数问题。
[例二]员工组织(UVAp10766OrganisingtheOrganisation)
Jimmy在公司里负责人员的分级工作,他最近遇到了一点小麻烦。
为了提高公司工作的效率,董事会决定对所有的员工重新分级!
图a员工分级图
分级后的情况如图a所示,A直接领导B和D,D直接领导C。
具体来说,除了一个总经理例外,其他所有的员工有且只有一个直接领导。
由于员工直接的人际关系,可能出现a和b都不愿意让对方成为自己直接领导的情况。
公司里的n位员工1-n编号,并且董事会已经决定让标号为k的员工担任总经理。
Jimmy的任务就是一共有多少种不同的员工分级方案。
数据规模:
1≤n≤50。
[分析]
这道题目的解法比较明显。
如果a和b直接没有矛盾,就在他们之间连一条边。
显然,最后我们得到的员工之间的关系图就使原图的一颗生成树。
虽然我们规定了生成树的根,但是因为无向图生成树的个数与根无关,所以我们只需要直接利用Matrix-Tree定理计算原图的生成树的个数即可。
[例三]国王的烦恼(原创)
Byteland的国王Byteotia最近很是烦恼,他的国家遭遇到了洪水的袭击!
百年未遇的洪水冲毁了Byteland许多重要的道路,使得整个国家处于瘫痪状态。
Byteland由n座城市组成,任何两个不同城市之间都有道路相连。
为了尽快使国家恢复正常秩序,Byteotia组织了专家进行研究,列举出了所有可以正常同行的道路(其他的道路可能还在洪水中)。
其中有的已经被冲毁,需要重新修复;有的则可以继续使用。
很奇怪的是,所有可以继续使用的道路并没有形成环。
为了最大限度的节省时间,Byteotia希望只修复最少的道路就可以使得整个国家连通。
Byteotia本来准备对每一种方案进行评估,选择最优的,不过很快他发现方案的个数实在是太多了。
因此,他找到了你——Byteland最优秀的计算机专家,帮他计算一下所有可能的修复方案的个数。
数据规模:
1≤n≤500。
[分析]
这道题目乍看起来很难,因为要求统计修复道路个数最少的方案的个数,同时还有不需要修复的道路需要考虑。
仔细分析后我们发现题目中一个十分重要的条件就是:
所有可以继续使用的道路并没有形成环!
这就为我们的解题创造了条件。
我们都知道,让一个n个点的图连通最少需要n-1条边,而这些边形成一颗树,而树的一个重要性质就是无环,因此所有可以继续使用的道路都一定存在于最后得到的树中。
这样,我们就成功地将问题转化为:
求一个图生成树的个数,其中有某些边必选。
这也是一道生成树的计数问题。
但是,由于必选边的存在,使得我们无法直接应用Matrix-Tree定理。
应该怎么办呢?
我们知道,如果我们要求生成树中必须包含一条边e,那么整个图G生成树的个数t(G)就等于t(G-e),即将e收缩后得到的新图的生成树的个数。
因此,我们需要:
1、将所有的必选边压缩;
2、求压缩后的新图的生成树的个数。
压缩一条边的时间复杂度为O(n),而最多只有n-1条边需要压缩,因此,这一步的复杂度为O(n2)。
根据前面的分析,计算一个图生成树的个数的时间复杂度为O(n3)。
因此,我们成功解决了整个问题,时间复杂度为O(n3)。
总结
本文介绍了生成树的计数算法及其包含的数学思想以及应用。
在讨论的过程中,我们将图的生成树和矩阵的行列式这两样看起来毫无关系的事物紧密地联系在了一起。
我们首先通过模型转化将图的生成树的计数转化为矩阵行列式的计算,再通过数学证明论证了矩阵的行列式与图的生成树之间的对应关系。
从中,我们不难发现:
扎实的数学功底是解决问题的保证,创造性地联想是解决问题的灵魂。
参考文献
[1]:
线形代数居余马等编著
[2]:
代数学引论许以超编著
[3]:
GraphTheoryIIReinhardDiestel
[4]:
连通图中含某些指定边的生成树的计数胡茂林
[5]:
CountingSpanningTreeMartinRubey