考研数据结构图的必背算法及知识点
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1.最小生成树:无向连通图的所有生成树中有一棵边的权值总和最小的生成树
问题背景:
假设要在n个城市之间建立通信联络网,则连通n个城市只需要n—1条线路。这时,自然会考虑这样一个问题,如何在最节省经费的前提下建立这个通信网。在每两个城市之间都可以设置一条线路,相应地都要付出一定的经济代价。n个城市之间,最多可能设置n(n-1)/ 2条线路,那么,如何在这些可能的线路中选择n-1条,以使总的耗费最少呢
分析问题(建立模型):
可以用连通网来表示n个城市以及n个城市间可能设置的通信线路,其中网的顶点表示城市,边表示两城市之间的线路,赋于边的权值表示相应的代价。对于n个顶点的连通网可以建立许多不同的生成树,每一棵生成树都可以是一个通信网。即无向连通图的生成树不是唯一的。连通图的一次遍历所经过的边的集合及图中所有顶点的集合就构成了该图的一棵生成树,对连通图的不同遍历,就可能得到不同的生成树。
图G5无向连通图的生成树为(a)、(b)和(c)图所示:
G5
G5的三棵生成树:
可以证明,对于有n个顶点的无向连通图,无论其生成树的形态如何,所有生成树中都有且仅有n-1条边。
最小生成树的定义:
如果无向连通图是一个网,那么,它的所有生成树中必有一棵边的权值总和最小的生成树,我们称这棵生成树为最小生成树,简称为最小生成树。
最小生成树的性质:
假设N=(V,{E})是个连通网,U是顶点集合V的一个非空子集,若(u, v)是个一条具有最小权值(代价)的边,其中,
则必存在一棵包含边(u,v)的最小生成树。
解决方案:
两种常用的构造最小生成树的算法:普里姆(Prim)和克鲁斯卡尔(Kruskal)。他们都利用了最小生成树的性质
1.普里姆(Prim)算法:有线到点,适合边稠密。时间复杂度O(N^2)假设G=(V,E)为连通图,其中V为网图中所有顶点的集合,E为网图中所有带权边的集合。设置两个新的集合U和T,其中
集合U(顶点集)用于存放G的最小生成树中的顶点,
集合T(边集合)存放G的最小生成树中的边。
T,U的初始状态:令集合U的初值为U={u1}(假设构造最小生成树时,从顶点u1出发),集合T的初值为T={}。
Prim算法的思想是:从所有u∈U,v∈V-U的边中,选取具有最小权值的边(u,v)∈E,将顶点v加入集合U中,将边(u,v)加入集合T中,如此不断重复,直到U=V时,最小生成树构造完毕,这时集合T中包含了最小生成树的所有边。
Prim算法可用下述过程描述,其中用wuv表示顶点u与顶点v边上的权值。
(1)U={u1},T={};
(2)while(U≠V)do
(u,v)=min{wuv;u∈U,v∈V-U}
T=T+{(u,v)}
U=U+{v}
(3)结束。
按照Prim方法,从顶点1出发,该网的最小生成树的产生过程如图:
为实现Prim算法,需设置两个辅助closedge,用来保存U到集合V
-U的各个顶点中具有最小权值的边的权值。对每个Vi∈(V-U)在
辅助数组中存在一个相应的分量closedge[i-1],它包括两个域:
typedefstructArcNode
{
intadjvex;
owcost=0;owcost,故需修改closedge[1]为边(v2,v3)及其权值,同理修改c losedge[4],closedge[5].
closedge[1].adjvex=3.
closedge[1].lowcost=5.
closedge[4].adjvex=1.
closedge[4].lowcost=5.
closedge[5].adjvex=3.
closedge[5].lowcost=6.
以此类推,直至U=V;
下图给出了在用上述算法构造网图的最小生成树的过程中:
Prim算法实现:
按照算法框架:
(1)U={u1},T={};
(2)while(U≠V)do
(u,v)=min{wuv;u∈U,v∈V-U}
T=T+{(u,v)}
U=U+{v}
(3)结束。
当无向网采用二维数组存储的邻接矩阵存储时,Prim算法的C语言实现为:
owcost中求最小值,其频度为n-1;其二是重新选择具有最小代价的边,其频度为n。由此,普里姆算法的时间复杂度为O(n2),与网中的边数无关,因此适用于求边稠密的网的最小生成树。
2.克鲁斯卡尔(Kruskal):由点到线,适合边稀疏的网。时间复杂度:O(e*loge)
Kruskal算法是一种按照网中边的权值递增的顺序构造最小生成树
的方法。
基本思想是:
1)设无向连通网为G=(V,E),令G的最小生成树为T,其初态为T=(V,{}),即开始时,最小生成树T由图G中的n个顶点构成,顶点之间没有一条边,这样T中各顶点各自构成一个连通分量。
2)在E中选择代价最小的边,若该边依附的顶点落在T中不同的连通分量,则将此边加入到T中,否则舍弃此边而选择下一条边(若该边依附的两个顶点属于同一个连通分量,则舍去此边,以免造成回路)。依此类推,当T中的连通分量个数为1时,此连通分量便为G的一棵最小生成树。
按照Kruskal方法构造最小生成树的过程如图所示:
在构造过程中,按照网中边的权值由小到大的顺序,不断选取当前未被选取的边集中权值最小的边。依据生成树的概念,n个结点的生成树,有n-1条边,故反复上述过程,直到选取了n-1条边为止,就构成了一棵最小生成树。
Kruskal算法的实现: