生成树的计数及其应用Word格式文档下载.docx
《生成树的计数及其应用Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《生成树的计数及其应用Word格式文档下载.docx(15页珍藏版)》请在冰豆网上搜索。
[例一]高速公路(SPOJp104Highways)
一个有n座城市的组成国家,城市1至n编号,其中一些城市之间可以修建高速公路。
现在,需要有选择的修建一些高速公路,从而组成一个交通网络。
你的任务是计算有多少种方案,使得任意两座城市之间恰好只有一条路径
数据规模:
1≤n≤12。
<
[分析]
我们可以将问题转化到成图论模型。
因为任意两点之间恰好只有一条路径,所以我们知道最后得到的是原图的一颗生成树。
因此,我们的问题就变成了,给定一个无向图G,求它生成树的个数t(G)。
这应该怎么做呢
经过分析,我们可以得到一个时间复杂度为O(3n*n2)的动态规划算法,因为原题的规模较小,可以满足要求。
但是,当n再大一些就不行了,有没有更优秀的算法呢答案是肯定的。
在介绍算法之前,首先让我们来学习一些基本的预备知识。
预备知识
下面,我们介绍一种重要的代数工具——行列式。
为了定义行列式,我们首先来看一下排列的概念。
排列
定义1由1,2,…,n组成的一个有序数组i1i2…in称为1,2,…,n的一个排列。
由排列的定义可知,i1,i2,…,in表示了n个不同的自然数,同时i1,i2,…,in中的每个自然数都是集合Sn={1,2,…,n}中的一个元素,换句话说,
定义了集合Sn到自身上的一个一一对应。
这个一一对应可以用符号
记之,称为置换,而上述一一对应可以改写为
其中j1j2…jn是1,2,…,n的一个排列。
所以这个一一对应也可以用符号
记之,因此对1,2,…,n的任一排列j1j2…jn,可定义
任取一个排列i1i2…in,将其中两个相邻的自然数ij-1,ij对换一下,便造出一个新的排列i1i2…ij-2ijij-1ij+1…in,称为原来排列的对换排列,这样一种步骤成为对换。
显然,对于任何一个排列经过若干次对换后都可以变成标准排列12…n。
不过,不管经过什么途径作对换,在给定排列i1i2…in后,关于对换的次数有下列重要定理。
!
定理1将任意一个排列i1i2…in通过对换变成标准排列12…n,所需的对换次数的奇偶性与对换方式无关。
利用这个定理,我们引入
定义2一个排列i1i2…in称为偶(奇)排列,如果有一种方式,经过偶(奇)数次对换后,可以将排列i1i2…in变为标准排列12…n。
设排列i1i2…in经过t次对换后变为标准排列12…n,则数值(-1)t和对换方式无关。
将它改写成
,即
n个确定自然数1,2,…,n的排列,可以看作是集合Sn={1,2,…,n}到自身上的一个一一对应。
将这个概念推广,任取n个元素的集合S={a1,a2,…,an}。
对于集合S到自身上的一一对应
称为
的一个排列。
容易看出,
是
的排列的充要条件是i1i2…in是1,2,…,n的排列。
—
同样,排列
变为标准排列
的对换总次数的奇偶性和对换方式无关,因此引入符号
其中t是某一种将
变为
的对换方式的对换总次数。
下面我们介绍行列式。
行列式
一阶行列式是一个变量a11的函数det(a11)=a11,也可以改写成为
二阶行列式是四个变量a11,a12,a21,a22的函数
,也可以改写成
三阶行列式是九个变量aij(i,j=1,2,3)的函数
[
,同样可以改写成为
通过观察一、二、三阶行列式的定义,我们得出了n阶行列式的一般定义。
定义3n阶矩阵A的行列式是一实数,记作detA,它定义为
行列式有下列几种常用的符号:
由行列式的定义可知,利用定义直接计算行列式是很困难的,只有在阶数低时才可以直接用定义计算。
为了能够进行计算,需要先导出行列式的若干基本性质,在通过这些性质,将复杂的行列式计算化为简单的行列式计算,也可以将高阶行列式的计算化为低阶行列式的计算。
、
性质1设A是n阶矩阵,则
detAT=detA。
这个定理的重要意义在于,它告诉我们行列式的行和列的地位是平等的。
确切地说,每个关于行的性质,对列必然成立;
反之亦然。
性质2行列式的任两行(或两列)互换,行列式变号。
推论行列式的某两行(或两列)相同时,行列式的值为0。
性质3用实数λ乘以一行(或列)后,所得到的行列式等于原来的行列式乘以λ。
推论行列式有两行(或两列)成比例,则该行列式的值为零。
特别的,当行列式有一行(或列)全为零时,行列式的值为零。
|
性质4
对列也有同样性质。
推论将行列式的任意行(或一列)乘以实数λ,再相应地加到另一行(或另一列)上去,则行列式的值不变。
例如,当j≠1时
下面我们介绍一种计算行列式的方法。
首先,不难证明
今取行列式
}
我们可以将
化为上三角形式,记为
,同时记录行交换次数S。
根据定理11,易知:
再利用刚才的结论,得
。
对于矩阵A,任取2p个自然数
1≤i1<
i2<
…<
ip<
=n,1≤j1<
j2<
jp<
=n
在矩阵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