算法合集之《生成树的计数及其应用》
生成树的计数
生成树的计数郑艺容;周雪【摘要】In this paper, we explored the possibility of counting spanning tree in a combinatorial approach. We got three combinatorial identifies applying the inclusion-exclusion principle. Based on these identifies and mathematics induction, we gave an easy proof for the Cayley’s formula using a combinatorial argument. The approach combines the problem of graphical enumeration with classical problems in combinatorial mathematics and reveals the essence of the problem of counting spanning trees with better effect.%从组合数学的角度研究生成树的计数。
先利用容斥原理,得到3个组合恒等式,再从组合数学的角度出发,并利用数学归纳法给出了Cayley’s 公式的又一简便证明。
该计数方法将图的计数问题与组合数学中的经典问题联系起来,更好地揭示了生成树计数的本质。
【期刊名称】《厦门理工学院学报》【年(卷),期】2015(000)001【总页数】3页(P95-97)【关键词】Cayley’s 公式;生成树;容斥原理;数学归纳法【作者】郑艺容;周雪【作者单位】厦门理工学院应用数学学院,福建厦门361024; 福州大学离散数学中心,福建福州350003;福州大学离散数学中心,福建福州350003【正文语种】中文【中图分类】O157计算图的不同生成树的个数是图的计数问题中的一个重要研究课题.1857年,Cayley [1] 在研究给定碳原子数n的饱和碳氢化合物(CnH2n+2)的同分异构体的数目时,提出“树”的概念,即不含圈的连通图.如果连通图G的一个子图T是一棵树,且包含G的所有顶点,则该子图T称为G的生成树(Spanning Tree).设G 是一个图,t(G)表示G中不同生成树的个数.Cayley于1889年给出计算n阶完全图的不同生成树个数的公式,即著名的Cayley’s 公式.定理1 [2] (Cayley’s 公式) n阶完全图的不同生成树的个数Cayley’s 公式有很多不同的证明方法,参见文献[2-5].本文又给出Cayley’s 公式的又一简单证明.首先介绍一些基本概念和结论.容斥原理是组合数学中一个非常重要的定理,其内容如下:定理2[6 ] (容斥原理) 设A是有限集,Ai⊆A(i=1,2,…,n,n≥2),则设N={1,2,…,n},M={1,2,…,m},A表示N上所有p维数组构成的集合,其中p<m≤n.因为p<m,那么对A中的任意一个p维数组s,存在M中的元素i∉s.令Ai(i=1,2,…,m)表示A中不含有i的p维数组构成的集合,易知A=A1∪A2∪…∪Am.引理m.定理3 设n,m,p∈N+,p<m≤n,则以下组合恒等式成立证明A,Ai(i=1,2,…,m)定义如上.首先,由乘法原理可知.又A=A1∪A2∪…∪Am,根据容斥原理、对称性及引理1可得:特别地,当p=n-2时可得以下推论:推论(n≥3).以下给出Cayley’s 公式的另一简单证明.设T表示所有n阶生成树构成的集合,tn表示所有n阶生成树的个数,即.Ti(i=1,2,…,n)表示顶点i为树叶的所有n阶生成树构成的集合.引理2 集合T1∩T2∩…∩Tk满足:.证明由上述定义可知:T1∩T2∩…∩Tk那么表示顶点1,2,…,k(1≤k≤n)均为树叶的n阶生成树构成的集合,这样的任意一棵树可经过下述两个步骤得到.(i)由顶点k+1,k+2,…,n导出的子图T是一棵树,易知恰好有tn-k个这样的T;(ii)把顶点1,2,…,k添加到T中得到树T,使得顶点i(1,2,…,k)为T的树叶,即顶点i 恰好与顶点k+1,k+2,…,n中的某一个顶点相邻,这样的方式共有(n-k)k种,根据乘法计数原理可得:=(n-k)ktn-k .引理3 n阶不同生成树的个数tn满足:tn=1(n=1,2);(n≥3).证明T表示所有n阶生成树构成的集合,Ti(i=1,2,…n)表示所有n阶生成树中顶点i为树叶的生成树构成的集合,由于每棵非平凡树至少有两片树叶,故T=T1∪T2∪…∪Tn,由容斥原理、对称性及引理2可知:以下给出Cayley’s 公式的另一证明.定理4 所有不同n阶生成树的个数tn=nn-2 ( Cayley’s 公式)证明用数学归纳法(i)易知t1=t2=1,t3=3 结论显然成立.(ⅱ)假设定理对小于n的正整数都成立.(ⅲ)以下证明对n结论成立.根据引理3Cayley’s 公式是图计数中的经典公式,已有很多不同的证明方法,本文利用由容斥原理得到的组合恒等式并借助数学归纳法给出Cayley’s 公式的又一简单证明.接下来可进一步研究Cayley’s 公式的不同证明方法,特别是能将图的其它经典问题与图的计数问题联系起来证明Cayley’s 公式,更好地揭示图论中的一些本质联系.2【相关文献】[1]CAYLEY A.On the theory of the analytical forms called trees[J].Philophical Magazine,1857,13(4):172-176.[2]CAYLEY A.A theorem on trees[J].Quart J Math,1989,23:376-378.[3]SHOR P W.A new proof of Cayley’s formula for counting l abeled trees[J].J Combin Theory:Series A,1995,71:154-158.[4]ARIANNEJAD M,EMAMI M.A new proof of Cayley’s formula for counting labeled spanning trees[J].Electronic Notes in Discr Math,2014,45:99-102.[5]GODSIL C,ROYLE G.Algebraic graph theory[M].New York:Springer-Verlag,2001.[6]曹汝成.组合数学[M].广州:华南理工大学出版社,2000.。
最小生成树算及其应用
算法分析
2、套用最小生成树的经典算法求解
以机器蛇为顶点,以不受屏蔽的通信线路为边构建图,就可以直 接套用最小生成树的经典算法求解。由于几乎每两条机器蛇间都 会有一条边,因此应选用Prim算法。
设
const maxn=200 ; oo=2000000000;{ 机器蛇数的上限和无穷大} type TPoint=record {坐标} x,y:longint; end; var s,w1,w2:array[1..maxn] of TPoint; { 机器蛇的坐标和屏蔽线的坐标 } n,m,i,j,k:integer; ba:array[1..maxn] of boolean; { 机器蛇的访问标志} d:array[1..maxn] of longint; {d[i]以机器蛇i为头的最短边长} min:longint; ans:double;
如何证明呢?
最小生成树算法及应用
Kruskal算法在实现过程中的关键和难点在于:如何判断欲加入的一条边 是否与生成树中已保留的边形成回路? 我们可以将顶点划分到不同的集合中,每个集合中的顶点表示一个无回 路的连通分量,很明显算法开始时,把所有n个顶点划分到n个集合中,每个 集合只有一个顶点,表明顶点之间互不相通。当选取一条边时,若它的两个 顶点分属于不同的集合,则表明此边连通了两个不同的连通分量,因每个连 通分量无回路,所以连通后得到的连通分量仍不会产生回路,因此这条边应 该保留,且把它们作为一个连通分量,即把它的两个顶点所在集合合并成一 个集合。如果选取的一条边的两个顶点属于同一个集合,则此边应该舍弃, 因为同一个集合中的顶点是连通无回路的,若再加入一条边则必然产生回路。
机器蛇
算法合集之《生成树的计数及其应用》
算法合集之《生成树的计数及其应用》生成树是图论中的一个重要概念,指的是一个连通图中的一个子图,它包含图中的所有顶点,并且是一个树结构,即没有回路。
生成树可以应用于许多实际问题中,如网络设计、电路设计等。
生成树的计数是指给定一个图,计算其中生成树的个数。
本文将介绍生成树的计数方法及其应用。
生成树个数的计数方法主要有两种:基于度数矩阵的方法和基于邻接矩阵的方法。
基于度数矩阵的方法是通过度数矩阵计算生成树的个数。
度数矩阵是一个n*n的矩阵,其中第i行第j列的元素表示顶点i的度数。
对于一个连通图,它的度数矩阵满足以下性质:矩阵中每个元素都是对称的,对角线上的元素为顶点的度数,非对角线上的元素为-1、生成树的个数可以通过计算度数矩阵的行列式的值来获得。
基于邻接矩阵的方法是通过邻接矩阵计算生成树的个数。
邻接矩阵是一个n*n的矩阵,其中第i行第j列的元素表示顶点i和顶点j之间是否存在一条边。
对于一个连通图,它的邻接矩阵满足以下性质:矩阵中每个元素都是对称的,对角线上的元素为0,非对角线上的元素为1、生成树的个数可以通过计算邻接矩阵的专门构造的拉普拉斯矩阵的行列式的值来获得。
生成树的计数方法在实际应用中有着广泛的应用。
以下是两个典型的应用案例。
1.网络设计:在网络设计中,生成树可以用来表示一个网络的拓扑结构。
生成树的计数可以帮助设计师在设计网络时选择最佳的拓扑结构,以提高网络的可靠性和性能。
例如,在构建一个数据中心的网络时,生成树的计数可以帮助设计师选择恰当的网络拓扑结构,使得数据中心能够快速传输数据,并且故障时能够保持高可用性。
2.电路设计:在电路设计中,生成树可以用来表示电路中的连接关系。
生成树的计数可以帮助设计师评估电路的性能,并且选择合适的电路结构以优化电路的功耗和响应速度。
例如,在设计一个数字电路时,生成树的计数可以帮助设计师选择合适的连接方式,以最小化电路中的延迟和功耗。
综上所述,生成树的计数及其应用是一个复杂而重要的问题。
生成树的计数及其应用
生成树的计数及其应用安徽周冬目录生成树的计数及其应用 (1)目录 (1)摘要 (2)关键字 (2)问题的提出 (2)[例一]高速公路(SPOJ p104 Highways) (2)[分析] (2)预备知识 (2)排列 (3)行列式 (4)新的方法 (7)介绍 (7)证明 (9)理解 (12)具体应用 (12)[例二]员工组织(UVA p10766 Organising the Organisation) (13)[分析] (13)[例三]国王的烦恼(原创) (13)[分析] (14)总结 (14)参考文献 (14)摘要在信息学竞赛中,有关生成树的最优化问题如最小生成树等是我们经常遇到的,而对生成树的计数及其相关问题则少有涉及。
事实上,生成树的计数是十分有意义的,在许多方面都有着广泛的应用。
本文从一道信息学竞赛中出现的例题谈起,首先介绍了一种指数级的动态规划算法,然后介绍了行列式的基本概念、性质,并在此基础上引入Matrix-Tree定理,同时通过与一道数学问题的对比,揭示了该定理所包含的数学思想。
最后通过几道例题介绍了生成树的计数在信息学竞赛中的应用,并进行总结。
关键字生成树的计数Matrix-Tree定理问题的提出[例一]高速公路(SPOJ p104 Highways)一个有n座城市的组成国家,城市1至n编号,其中一些城市之间可以修建高速公路。
现在,需要有选择的修建一些高速公路,从而组成一个交通网络。
你的任务是计算有多少种方案,使得任意两座城市之间恰好只有一条路径?数据规模:1≤n≤12。
[分析]我们可以将问题转化到成图论模型。
因为任意两点之间恰好只有一条路径,所以我们知道最后得到的是原图的一颗生成树。
因此,我们的问题就变成了,给定一个无向图G,求它生成树的个数t(G)。
这应该怎么做呢?经过分析,我们可以得到一个时间复杂度为O(3n*n2)的动态规划算法,因为原题的规模较小,可以满足要求。
但是,当n再大一些就不行了,有没有更优秀的算法呢?答案是肯定的。
最小生成树算法总结
最小生成树算法总结最小生成树是指在一个无向连通图中,找到一个子树,使得这棵子树中所有边的权值之和最小。
最小生成树可以用于最优化问题,例如道路铺设、网络布线等。
下面将介绍三种最小生成树算法:Prim算法、Kruskal算法、Boruvka算法。
1. Prim算法Prim算法是一种贪心算法,从一个点开始,每次添加连接到已有集合中的最小边,直到所有点都在同一个集合中。
可以用以下步骤描述Prim算法:(1) 选择一个起点,将该起点加入最小生成树的顶点集合,然后将该顶点相邻的边加入边集合中。
(2) 从边集合中找到权值最小的一条边,将该边对应的顶点加入最小生成树的顶点集合,同时将该顶点相邻的边加入边集合中。
(3) 重复上述步骤,直到所有顶点都在最小生成树的顶点集合中。
Prim算法的实现可以使用堆优化,时间复杂度为O(E + VlogV),其中E为边数,V为顶点数。
2. Kruskal算法Kruskal算法也是一种贪心算法,与Prim算法不同的是,Kruskal算法是按照边的权值从小到大依次添加,直到所有顶点都在同一个集合中。
可以用以下步骤描述Kruskal算法:(1) 将所有边按照权值从小到大排序。
(2) 依次取出排好序的边,如果该边所连接的两个顶点不在同一个集合中,就将这条边加入最小生成树的边集合中,并将这两个顶点合并到同一个集合中。
(3) 重复步骤(2),直到所有顶点都在同一个集合中。
Kruskal算法的实现可以使用并查集,时间复杂度为O(ElogE),其中E为边数。
3. Boruvka算法Boruvka算法是一种基于集合的分治算法,与Prim算法和Kruskal算法不同,Boruvka算法的时间复杂度是线性的。
可以用以下步骤描述Boruvka算法:(1) 对每个顶点建立单元素集合。
(2) 对每个集合,选择与该集合相连的最小权值的边,将这些边添加到最小生成树的边集合中,并将这些集合合并到同一个集合中。
(3) 如果只剩下一个集合,算法结束。
集合论与图论中的生成树与网络流计算
PART FOUR
● 增广路径的定义:从源点到汇点的所有顶点的集合,且每条边都只使用一次的路径
● 增广路径算法的基本思想:通过不断寻找增广路径来增加网络流的流量,直到无法再找到增广路径为 止
● 增广路径算法的实现步骤: a. 初始化:设置源点为入度为0的顶点,其他顶点的入度为无穷大 b. 寻找 增广路径:从入度为0的顶点开始,沿着增广路径进行遍历,更新边的流量和剩余容量 c. 重复步骤b, 直到无法再找到增广路径为止
生成树在路由优化 中的应用:通过优 化路由路径,提高 数据传输效率
PART SIX
生成树算法的优化:提高算法的效率和稳定性,降低计算复杂度 网络流计算的应用拓展:在网络优化、社交网络分析、推荐系统等领域的应用
生成树与网络流计算的理论研究:研究生成树和网络流的基本性质和规律,探索新的理论模型和算法
最大流问题限制:不能超过容量限制,不能出现负流量
最小割集是网络流中的一种重要概念,它表示将网络分割成两个部分的集合。
最小割集是网络流中所有割集中的最小者,它可以确定网络的容量和流量。
最小割集可以通过Kruskal算法或Prim算法等图论算法来求解。
最小割集在网络流计算中具有重要的作用,它可以用来解决许多实际问题,如最大流问题、 最小费用流问题等。
最小生成树在网络流问题中的定义 最小生成树在网络流问题中的算法实现 最小生成树在网络流问题中的实际应用案例 最小生成树在网络流问题中的优缺点分析
最小生成树算法: 用于解决最小连接 问题,常用于网络 设计
最大生成树算法: 用于解决最大覆盖 问题,常用于网络 覆盖优化
生成树在流量控制 中的应用:通过控 制网络流量分布, 提高网络性能
PART FIVE
定义生成树:一个连通无环的子图,它包含了图中的所有顶点,但只包含部分边。
生成树算法的三个步骤
生成树算法的三个步骤生成树是图论中的重要概念,它描述了一个连通图的一个子图,该子图包含了图中的所有顶点,并且是无环的。
生成树算法是用来找到一个连通图的生成树的一种方法。
本文将介绍生成树算法的三个步骤:图的遍历、边的选择和生成树的构建。
一、图的遍历图的遍历是生成树算法的第一步,它的目的是将图中的所有顶点访问一遍。
常用的图的遍历算法有深度优先搜索(DFS)和广度优先搜索(BFS)。
深度优先搜索是通过递归的方式进行遍历,从某个顶点开始,先访问它的一个邻接顶点,然后再递归地访问该邻接顶点的邻接顶点,直到所有顶点都被访问过。
广度优先搜索是通过队列的方式进行遍历,从某个顶点开始,先访问它的所有邻接顶点,然后再依次访问这些邻接顶点的邻接顶点,直到所有顶点都被访问过。
二、边的选择边的选择是生成树算法的第二步,它的目的是选择一些边,使得这些边构成一个连通图的生成树。
常用的边的选择算法有最小生成树算法和最大生成树算法。
最小生成树算法的目标是选择一些边,使得这些边的权值之和最小。
常用的最小生成树算法有普里姆算法和克鲁斯卡尔算法。
普里姆算法是从一个顶点开始,每次选择一条最小权值的边,将该边连接的顶点加入到生成树中,直到所有顶点都被加入到生成树中。
克鲁斯卡尔算法是先将所有边按照权值从小到大排序,然后依次选择权值最小的边,如果这条边连接的两个顶点不在同一个连通分量中,则将这条边加入到生成树中。
最大生成树算法的目标是选择一些边,使得这些边的权值之和最大。
常用的最大生成树算法有逆克鲁斯卡尔算法和逆普里姆算法。
逆克鲁斯卡尔算法和逆普里姆算法的原理与克鲁斯卡尔算法和普里姆算法相反。
三、生成树的构建生成树的构建是生成树算法的第三步,它的目的是根据选择的边构建一个生成树。
生成树可以用邻接矩阵或邻接表来表示。
邻接矩阵是一个二维数组,其中的元素表示两个顶点之间是否有边。
邻接表是一种链表的数据结构,其中的每个节点表示一个顶点,节点的值表示该顶点的邻接顶点。
几种图的生成树的数目
几种图的生成树的数目
严坤妹
【期刊名称】《福建商业高等专科学校学报》
【年(卷),期】2009(000)005
【摘要】连通图G的生成树是它的极小连通生成子图.对给定图G来说,如何精确求解出国的全部生成树的数目,是图论中一个重要的问题;对于特殊的图类已经有着各种各样的计算方法,文章利用图的Kirchhoff矩阵研究了一些图类的生成树的数目,并给出了相应的生成树数的计算公式.
【总页数】4页(P85-88)
【作者】严坤妹
【作者单位】福建商业高等专科学校基础部,福建,福州,350012
【正文语种】中文
【中图分类】O157.6
【相关文献】
1.图类 Kn-CS 4(a1,a2,a3,a4)的生成树数目最大化条件 [J], 谭秋月
2.有关对称无权图生成树数目的拆分定理 [J], 龚和林;王伟
3.利用对偶图求平面图的生成树数目 [J], 徐幼专;徐立新
4.一类k-正则图的生成树数目与熵 [J], 贾环身;吴廷增
5.特殊图类的生成树数目 [J], 谢尘倩;陈平鸽
因版权原因,仅展示原文概要,查看原文内容请购买。
图论中的生成树枚举算法
图论中的生成树枚举算法在图论中,生成树是指一个连通图的一颗包含所有顶点的无回路子图。
生成树枚举算法即是通过遍历图中所有可能的生成树,找出其中的最优解或满足特定条件的解。
本文将介绍图论中的生成树枚举算法及其应用。
一、生成树枚举算法的基本原理生成树枚举算法的基本思想是在图中逐个枚举各个边的选择情况,通过判断生成树条件来确定是否选择该边。
在遍历过程中,需要使用一些数据结构来辅助算法的实现,如栈、队列等。
二、DFS算法DFS(深度优先搜索)是一种常用的生成树枚举算法。
该算法通过递归的方式对图进行遍历,从一个顶点开始,沿着一条路径一直往下搜索直到无法继续为止,然后回溯到上一个顶点,继续搜索其他路径。
在遍历的过程中,使用一个标记数组来记录已经访问过的顶点,避免重复遍历。
三、BFS算法BFS(广度优先搜索)是另一种常用的生成树枚举算法。
该算法使用队列来辅助遍历,从一个顶点开始,将该顶点入队,然后把与该顶点相邻的未访问过的顶点全部入队。
接着将队首顶点出队,并标记为已访问,继续将其未访问过的相邻顶点入队。
直到队列为空为止,算法结束。
四、应用场景生成树枚举算法在实际应用中有着广泛的适用性。
以下是其中几个常见的应用场景:1. 网络设计:在网络拓扑结构设计中,生成树算法可以用于选择最优的网络链路连接方式,以提供最佳的传输质量和可靠性。
2. 最小生成树:生成树枚举算法可以用于寻找图中的最小生成树,即连接所有顶点且总边权最小的生成树。
常用的算法包括Prim算法和Kruskal算法。
3. 路径规划:在求解最短路径问题时,生成树枚举算法可以辅助确定从起点到终点的最短路径。
4. 社交网络分析:生成树枚举算法可以用于分析社交网络中的关系,例如在微博转发传播过程中,通过枚举生成树可以确定信息传播的路径。
五、总结生成树枚举算法是图论中的重要算法之一,它通过遍历图中所有可能的生成树来找到最优解或满足特定条件的解。
DFS和BFS是两种常用的生成树枚举算法,它们在不同场景下可以灵活运用。
生成树 算法
生成树算法
生成树算法是图论中的一个重要概念,它可以用来找到一张图的最小生成树。
最小生成树是一张图的一个子图,它包含了原图中的所有节点,并且连接这些节点的边的权重之和最小。
常用的生成树算法包括Kruskal算法和Prim算法。
Kruskal算
法的思路是将图中所有边按照权重从小到大排序,然后逐个加入生成树中,直到生成树包含了原图中的所有节点为止。
Prim算法的思路
是从一个起始节点开始,逐步地将与该节点相连的边加入生成树中,每次选择权重最小的边。
除了Kruskal算法和Prim算法,还有一些其他的生成树算法,
比如Boruvka算法和Huffman算法。
这些算法各有特点,适用于不同的场景。
生成树算法在实际应用中有着广泛的应用,比如在计算机网络中,生成树算法可以用来构建网络的拓扑结构,以及优化数据传输的效率。
在城市规划中,生成树算法可以用来规划道路和建筑物的布局。
- 1 -。
最小生成树应用
begin read(n);{ 读入数据 } for i:=1 to n do with s[i] do read(x,y); read(m); for i:=1 to m do read(w1[i].x,w1[i].y,w2[i].x,w2[i].y); {用Prim算法求最小生成树 } fillchar(ba,sizeof(ba),0); {所有机器蛇未访问} for i:=2 to n do d[i]:=oo; {最短边长序列初始化} d[1]:=0 ;ans:=0; {从机器蛇1出发,通信网的最短长度初始化} for i:=1 to n do begin {访问n条机器蛇} min:=oo;{在所有未访问的机器蛇中寻找与已访问的机器蛇相连且具有最短边长 的机器蛇k} for j:=1 to n do if not ba[j] and (d[j]<min) then begin k:=j; min:=d[j]; end;{then} if min=oo then begin ans:=-1; break; end;{then}{若这样的机器蛇不存在, 则无解退出} ans:=ans+sqrt(min); ba[k]:=true; {最短边长计入通信网,机器蛇k已访问} for j:=1 to n do {机器蛇k出发的所有不受屏蔽的边中,寻找边长最短的(k,j)} begin min:=dist(k,j); if min<d[j] then d[j]:=min; end;{for} end;{for} writeln(ans:0:3); {输出通信网的最短长度} end.{main}
[输入格式] 输入文件第一行为整数n(2<=n<=100),表示计算机的数目。此后的n 行,每行n个整数。
最小生成树算法的应用
最小生成树算法的应用最小生成树算法是图论中重要的算法之一,其可用于解决许多实际问题。
在无向连通图中,最小生成树指的是图中所有边的集合,使得连接所有节点的代价最小。
最小生成树算法主要有Prim算法和Kruskal算法两种,本文将探讨这两种算法的应用。
一、Prim算法及其应用Prim算法是一种基于贪心思想的最小生成树算法,它将整个图分为两个集合:已经包含在最小生成树内的节点集合和未包含在最小生成树内的节点集合。
算法开始时,已经包含在最小生成树内的节点集合为空,未包含节点集合包含整个图。
随着算法的进行,两个集合中的节点不断互相转移,直至最小生成树形成为止。
以下是Prim算法的基本步骤:1. 从任意一个节点开始,将其加入已包含节点集合中。
2. 对于已包含节点集合中的所有节点,找出它们与未包含节点集合中节点的边中权值最小的那条,将与之相连的节点加入已包含节点集合中。
3. 重复步骤2,直至最小生成树形成。
Prim算法的时间复杂度为O(N^2),其中N为图中节点数。
因此,Prim算法适用于节点数量较少的图。
Prim算法有许多实际应用,其中之一是在计算机网络中实现路由协议。
在网络中,每一个节点都需要选择一个和自己相连的节点作为下一步传递数据的目标。
为了避免重复传输或者丢失数据包,路由协议需要保证每一个数据包能够找到最短的传输路径,同时尽可能地避免网络拥塞。
Prim算法恰好能够解决这个问题,它能够由网络中的节点生成一颗树,树上的每个节点都能够连接网络中所有的节点,同时保证整个连接过程中的最短路径。
因此,Prim算法成为计算机网络中重要的算法之一。
二、Kruskal算法及其应用Kruskal算法也是一种基于贪心思想的最小生成树算法,它将整个图先看做是一个节点的集合,然后不断地将边加入其中,形成最小生成树。
Kruskal算法的基本步骤如下:1. 将图中所有边按照权值从小到大排序。
2. 依次遍历所有的边,在加入当前边时,判断当前边的两个节点是否在同一个集合中,如果不在同一个集合中,就将它们合并,并将这条边加入最小生成树的边集中。
算法合集之《最小生成树算法及其应用》
第 5 页 共 29 页
IOI2004 国家集训队论文 吴景岳
图 3 Kruskal 算法的执行流程 Kruskal 算法在图 G=(V,E)上的运行时间取决于如何实现集合的合并。我们可 以采用路径压缩的优化方法,这是目前所知的最有效的。初始化需占用时间 O(V),第 4 行中对边进行排序需要的运行时间为 O(ElgE);对分离集的森林要进 行 O(E)次操作,总共需要时间为 O(Eα(E,V)),其中α函数为 Ackermann 函数的 反函数。因为α(E,V)=O(lgE)。所以 Kruskal 算法的全部运行时间为 O(ElgE)。 Prim 算法: 正如 Kruskal 算法一样。Prim 算法也是最小生成树一般算法的特例。它的执 行非常类似于寻找图的最短通路的 Dijkstra 算法。Prim 算法的特点是集合 A 中 的边总是只形成单棵树。如图 4 所示,阴影覆盖的边属于正在生成的树,树中的 结点为黑色。在算法的每一步,树中与树外的结点确定了图的一个割,并且通过 该割的轻边被加进树中。树从任意根结点 r 开始形成并逐渐生长直至该树跨越了 V 中的所有结点。在每一步,连接 A 中某结点到 V-A 中某结点的轻边被加入到 树中。由推论 1,该规则总是加入对 A 安全的边,因此当算法终止时,A 中的边 就成为一棵最小生成树。因为每次添加到树中的边都是使树的权尽可能小的边, 因此上述策略是“贪心”的。 有效实现 Prim 算法的关键是设法较容易地选择一条新的边添加到由 A 的边 所形成的树中,在下面的伪代码中,算法的输入是连通图 G 和将生成的最小生 成树的根 r。在算法执行过程中,不在树中的所有结点都驻留于优先级基于 key 域的队列 Q 中,对每个结点 v,key[v]是连结 v 到树中结点的边所具有的最小权 值;按常规,若不存在这样的边则 key[v]=∞。域π[v]表示点 v 的“父亲结点”。 在算法执行中,GENERIC-MST 的集合 A 隐含地满足: A={(v,π[v]):v∈V-{r}-Q} 当算法终止时,优先队列 Q 为空,因此 G 的最小生成树 A 满足: A={(v,π[v]): v∈V-{r}}
一个求全部生成树的新算法
一个求全部生成树的新算法
谢时敏
【期刊名称】《哈尔滨电工学院学报》
【年(卷),期】1989(012)001
【摘要】本文提出了求图的全部生成树的新算法.它能系统地生成全部树,且不产生冗余项.本算法原理简单、步骤较少、速度较快,并容易在计算机上实现.最后用实例进行了说明.
【总页数】4页(P77-80)
【作者】谢时敏
【作者单位】无
【正文语种】中文
【中图分类】O157.9
【相关文献】
1.求合取范式可满足性问题全部解的一个算法 [J], 曾振柄
2.一个新的基于数据库技术的快速求核算法 [J], 徐章艳;杨炳儒;宋威;侯伟
3.求极小极大分式规划问题的一个新的分支定界算法 [J], 汪春峰;蒋妍;申培萍
4.求不定二次规划全局解的一个新算法 [J], 黎健玲;孙小玲
5.求二次比式和问题全局解的一个新的确定性算法 [J], 张博;高岳林
因版权原因,仅展示原文概要,查看原文内容请购买。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
问题分析
• 压缩一条边的时间复杂度为O(n),而最多 只要压缩n-1条边。因此,第一步的复杂度 为O(n2)。
• 计算一个图的生成树的个数的时间复杂度 依赖于求其Kirchhoff矩阵行列式的时间复 杂度,为O(n3)。
• 因此,整个算法的时间复杂度为O(n3)。
总结
矩阵的行列式
模型转化
数学证明
det Brx BrxT
det Brx 2
x1,2,,m
x1,2,,m
x1,2,,m
|x|n1
|x|n1
|x|n1
• 其中,Brx 是把Br中属于x的列抽出后形成的 新矩阵。
定理的证明
detCr det BrBTr
det Brx det BrxT
det Brx BrxT
• 该定理也可以扩展到有向图上,用来计算 有向图的外向树的个数。
信息学竞赛中的应用
• [例二] UVa p10766 Organising the Organisation
• [例三] 国王的烦恼
[例三]国王的烦恼
• 一个王国由n座城市组成。 • 由于遭到了洪水的袭击,许多道路都被冲
毁了。
• 国王组织了专家进行研究,列举出了所有 可以正常通行的道路。其中有的已经被冲 毁,需要重新修复;有的则可以继续使用。 并且所有可以继续使用的道路没有形成环。
– 点:城市 – 边:通讯线路
• 任意两点之间恰好只有一条路径
– 这是一颗树!
• 问题转化为:给定一个n个点的无向图,其 中无重边和自环,试求其生成树的个数。
分析
• 由于原题规模较小,因此我们可以使用一 些复杂度较高的算法来解决它,如指数级 的动态规划算法。
• 但是,如果规模更大一些呢? • 预备知识
图的生成树
扎实的数学功底是解决问题的保证 创造性的联想则是解决问题的灵魂
• 这个定理看起来非常“神奇”,让我们尝 试着去证明一下吧!
定理的证明
• 经过分析,我们可以发现图的Kirchhoff矩 阵C具有一些有趣的性质:
– C的行列式总是0。 – 如果图是不连通的,则C的任一个n-1阶主子式
的行列式均为0。 – 如果图是一颗树,那么C的任一个n-1阶主子式
的行列式均为1。 – 证明略。
b
• 共有2种方案,如右
下角所示
d
d
方案1
方案2
问题分析
• 难点在于
– 由于必选边的存在,我们无法直接应用 Matrix-Tree定理
• 我们知道,如果要求生成树中必须包含某 条边e,那么,我们可以将e压缩,将原图 的问题转化到新图上来。
• 因此,我们需要
1、将所有的必选边压缩 2、求压缩后的图的生成树的个数
• 有了Kirchhoff矩阵这个工具,我们可以引入 Matrix-Tree定理:
– 对于一个无向图G,它的生成树个数等于其Kirchhoff 矩阵任何一个n-1阶主子式的行列式的绝对值。
– 所谓n-1阶主子式,就是对于任意一个r,将C的第r行 和第r列同时删去后的新矩阵,用Cr表示。
Matrix-Tree定理
• 试求方程 x1 +x2 + x3 =2
所有非负整数解的个数。
• 这是大家都很熟悉的一道组合计数问题。 • 通常的解法是,设有2个1和两个△,我们
将这4个元素任意排列,那么不同的排列的
个数就等于原方程解的个数,即 C42 。
• 为什么要这样做呢?
定理的理解
• 我们将所有6种排列列出后发现,一种排列就对应 了原方程的一个解:
det Brx 2
x1,2,,m
x1,2,,m
x1,2,,m
|x|n1
|x|n1
|x|n1
• 注 若意属观于x察的上n面-1的条式边子形,成BrxB了rxT一实颗际树上时是,图由Gx的 Kirchhoff矩阵的一 性个 质n可-知1主de子t B式rxB。rxT 其等中于G1。x
• 是 的 若 至由子属少所图于含x有。有的的两n顶 个-1点 连条和 通边属 块没于 ,有这x形的时成边d树e组t B,成rxB则r的xT G等一x中于个将0G。
• 这种转化的重要意义在于:在不同问题之间的架 起了互相联系的桥梁。
定理的理解
• 回到我们讨论的Matrix-Tree定理上来。
• 我们同样是经过模型的转化后(将图模型 转化为矩阵模型),发现Binet-Cauchy公 式展开式中的每一项对应着边集一个大小 为n-1的子集。其中,值为1的项对应一颗 生成树,而没有对应生成树的项值为0。这 样,将问题转化为求展开式中所有项之和。 再利用已有的数学知识,就可以成功解决 这个问题。
生成树的计数及其应用
芜湖限制生成树
最优比率生成树 ……
[例一]高速公路
• 一个国家需要在n座城市之间建立通信网络。 • 某些城市之间可以铺设通信线路。 • 要求任意两座城市之间恰好有一条通讯路
线,试求方案个数。 • 满足:1≤n ≤12。
分析
• 首先将问题抽象成图论模型
定理的证明
• 我们知道,C=BBT,因此,我们可以把C 的问题转化到BBT上来。
• 设Br为B去掉第r行得到的矩阵,容易知道 Cr =Br Br T。这时,根据Binet-Cauchy公 式,我们可以将Cr的行列式展开。
detCr det BrBTr
det Brx det BrxT
• 因此,当i=j时, BBTij=vi的度数;而当 i1≠,j时否,则如BB果Ti存j=在0。边(vi,vj),那么BBTij=-
• 我们通常将BBT称为图的Kirchhoff矩阵。
图的Kirchhoff矩阵
• 对于无向图G,它的Kirchhoff矩阵C定义为它的 度数矩阵D减去它的邻接矩阵A。显然,这样的定 义满足刚才描述的性质。
• 因此,我们认为:每次从边集中选出n-1条
边,若它们形成了生成树,则答案加1,否
则不变。
定理的理解
• 当x取遍边集所有大小为n-1的子集后,我 们就可以得到原图生成树的个数。这样我 们成功证明了定理!
• 刚才的证明过程看起来有些“深奥”,下 面就让我们从直观上来理解一下这个定理 的原理。
定理的理解
– △ △ 11对应x1=0,x2=0,x3=2 – △ 1 △ 1对应x1=0,x2=1,x3=1 – △ 11 △对应x1=0,x2=2,x3=0 – ……
• 也就是说,我们通过模型的转化,找出了原问题 和新问题之间的对应关系,并利用有关的数学知 识解决了转化后的新问题,也就同时解决了原问 题。
两个问题的对比
类似
方程的解
图的生成树
对应
排列方案
对应 类似
展开式的项
不同之处在于: 相互之间的对应关系更加隐蔽、复杂
需要更加强大的数学理论来支撑
定理的扩展
• 利用该定理,我们可以容易得到著名的 Cayley公式:完全图Kn有nn-2颗生成树。
• 我们刚才只对图中没有重边的情况进行了 分析。实际上,图中有重边时该定理仍然 成立,并且证明与没有重边的情况类似。
关联矩阵、Kirchhoff矩阵
图的关联矩阵
• 对于无向图G,我们定义它的关联矩阵B是 一个n*m的矩阵,并且满足:
– 如果ek=(vi,vj),那么Bik和Bjk一个为1,另一 个为-1,而第k列的其他元素均为0。
• 图G的关联矩阵如右下角所示:
v2
e1 e2 e3
v1 e1
e3
v1 1 1 0 v2 1 0 1
• 让我们通过一个例子来解释一下定理。如 图所示,G是一个由5个点组成的无向图。
• 它的Kirchhoff矩阵C为
2 1 1 0 0
1 3 1 1 0
1 1 3 0 1
0 1 0 2 1
0
0
1 1
2
Matrix-Tree定理
• 我们取r=2,根据行列式的定义易知 |detC2 | =11,这11颗生成树如下图所示。
[例三]国王的烦恼
• 国 如王右希图望所修示建 ,最 王少 国的 由
a
道 a、路b,、使c、得d任,意4两座个城
c
城 市市组之成间都能互达。
b
• 请 其你中计算可行方案的
总– 蓝数色。边表示可以通行 • 下但面需我要们修通复过的一道个路例 a
子– 红来色看边一表下示。可以继续
da c
c
使用的道路
b
e2 v3
v3 0 1 1
图G
图的关联矩阵
• 图的关联矩阵有什么特殊的性质呢? 我们不妨来考察一下B和它的转置矩阵 BT的乘积。
图的关联矩阵
• 根据矩阵乘法的定义,我们可以得到:
m
m
BB T ij Bik BT kj Bik B jk
k 1
k 1
• 也就是说,BBTij是B第i行和第j行的内积。