数据结构---->图的连通性和最小生成树
图的连通性和最小生成树
四 图的连通性
生成树:是一个极小连通子图,它含有图中全部顶点,但只有n-1条边。
生成森林:由若干棵生成树组成,含全部顶点,但构成这些树的边是最少的。
1:对连通图进行遍历,得到的是什么?
——得到的将是一个极小连通子图,即图的生成树!
由深度优先搜索得到的生成树,称为深度优先搜索生成树。
由广度优先搜索得到的生成树,称为广度优先搜索生成树。
2:对非连通图进行遍历,得到的是什么?
—— 得到的将是各连通分量的生成树,即图的生成森林!
4.1 无向图的连通分量和生成树
在对无向图进行遍历时,对于连通图,仅需从图中任何一个顶点出发,进行深度优先搜索或广度优先搜索,便可访问到图中所有顶点。对于非连通图,则需从多个顶点出发进行搜索,而每次从一个新的起始点出发进行搜索的过程中得到的顶点访问序列恰为其各个连通分量中的顶点集。
(a)中的图是非连通图,若从顶点a 开始进行深度优先搜索遍历,在选择未曾访问的邻接点时按照顶点在图中的位置顺序(即a , b , c , d , e , f , g , h)选择,2 次调用DFS 方法(分别从a、d 出发)得到的访问序列为a , b , c , f , e 和 d , g , h这两个顶点集加上所有依附于它们的边,便构成了非连通图的2个连通分量如图(b)、
生成树
设E是连通图G中所有边的集合,则从图中任意一个顶点出发遍历图时,必定将E分成两个子集:Et和Eb,其中Et是遍历图过程中经历的边的集合;Eb是剩余边的集合。显然Et和图中所有顶点一起构成连通图G的极小连通子图,即图G的生成树。并且由深度优先搜索得到的为深度优先搜索生成树;由广度优先搜索得到的为广度优先搜索生成树。
例如图(d)和图(e)所示(不包括虚线代表的边)分别为图(a)中连通图的深度优先搜索生成树和广度优先搜索生成树,而图中虚线表示的边为集合Eb中的边。
对于非连通图,每个连通分量中的顶点集以及在遍历时走过的边一起构成若干棵生成树,这些连通分量的生成树组成非连通图的生成树森林。例如图(c)所示为图(a)的深度优先搜索森林,它由2棵深度优先搜索生成树组成。
求最大连通分量的方法——只能用DFS(深度优先搜索)
4.2 有向图的强连通分量
从有向图中某个顶点s出发进行深度优先搜索或广度优先搜索,只能得到顶点s的可达分量,不一定能够得到包含s在内的强连通分量。
有向图中求强连通分量的算法。
对于任何有向边e = <u,v>,称R(e)=<v,u>为e的镜像边,即R(e)的起点(终点)就是e的终点(起点)。对于任何有向图G=(V,E),我们称R(E)= {R(e)|e∈E}为E 的镜像边集,也就是说,集合R(E)是由E中各边的镜像边组成。此时,也称R(G)=(V,R(E))为G的镜像图。
为构造图G = (V,E)中包含顶点s 的强连通分量有如下方法:求出顶点s在图G中的可达分量与顶点s 在R(G)中的可达分量的交集;
图(a)中灰色的顶点集为a 在G 中的可达分量;图(b)中灰色的顶点为a 在R(G)中的可达分量;图(c)中灰色的顶点为顶点a 在图G 中的可达分量与a在R(G)中的可达分量的交集,它们以及与它们关联的边就构成了包含a 的强连通分量。
如果需要确定有向图的所有强连通分量,可以从图中每个顶点出发重复上述操作,然而
这种方法时间复杂度较高,实际上为确定有向图的所有强连通分量,只需要进行两次深度优
先搜索即可,一次是在有向图G上进行,另一次是在R(G)上进行。
五、最小生成树
5.1、最小生成树问题产生
典型用途:
欲在n个城市间建立通信网,则n个城市应铺n-1条线路;但因为每条线路都会有对应的经济成本,而n个城市可能有n(n-1)/2条线路,那么,如何选择n–1条线路,使总费用最少?
数学模型:
顶点———表示城市,有n个;
边————表示线路,有n–1条;
边的权值—表示线路的经济代价;
连通网——表示n个城市间通信网。
问题抽象: n个顶点的生成树很多,需要从中选一棵代价最小的生成树,即该树各边的代价之和最小。此树便称为最小生成树MST(Minimum cost Spanning Tree)
使用不同的遍历图的方法,可以得到不同的生成树;从不同的顶点出发,也可能得到不同的生成树。按照生成树的定义,n个顶点的连通网络的生成树有n个顶点、n-1条边。我们把代价最小(树中每条边上权值之和)的生成树称为图的最小生成树(minimum spanning tree)。
5.2、最小生成树的求法
目标:在网的多个生成树中,寻找一个各边权值之和最小的生成树。
应用:n个城市建网,如何选择n–1条线路,使总费用最少?
最小生成树的 MST 性质如下:
若U集是V的一个非空子集,若(u0,v0)是一条最小权值的边,其中u0∈U,v0∈V-U;则(u0, v0)必在最小生成树上。
Kruskal算法特点:将边归并,适于求稀疏网的最小生成树。
Prime算法特点: 将顶点归并,与边数无关,适于稠密网。
这两个算法,都是利用MST性质来构造最小生成树的。
5.2.1 Kruskal----克鲁斯卡尔算法
设N ={V,E}是有n个顶点的连通网,
步骤:
(1) 首先构造一个只有n个顶点但没有边的非连通图T={V,Φ}, 图中每个顶点自成一个连通分量。
(2) 当在边集 E 中选到一条具有最小权值的边时,若该边的两个顶点落在T中不同的连通分量上,则将此边加入到生成树的边集合T 中;否则将此边舍去,重新选择一条权值最小的边。
(3) 如此重复下去,直到所有顶点在同一个连通分量上为止。此时的T即为所求(最小生成树)
计算机实现Kruskal算法?
算法描述:
构造非连通图 ST=( V,{ } );
k = i = 0; // k计选中的边数
while (k<n-1) {
++i;
检查边集 E 中第 i 条权值最小的边(u,v);
若(u,v)加入ST后不使ST中产生回路,则输出边(u,v); 且k++;
}
算法实现要点:构成回路的判断: 每个结点增加一个属性set,用于标识该结点所属的集合。可用于判断新的边加入后是否构成回路。
(1)初始时,令每个顶点的set互不相同;每个边的flag为0
(2)选出权值最小且flag为0的边
(3)若该边依附的两个顶点的set 值不同,即非连通,则令该边的flag=1, 选中该边;再令该边依附的两顶点的集合以及两集合中所有顶点的set相同(一种简便的方法是将所有set等于终点的set值的都改成起始点的set值)
若该边依附的两个顶点的set值相同,即连通,则令该边的flag=2, 即舍去该边
(4)重复上述步骤,直到选出n-1条边为止
初始状态入上图所示
5.2.2 Prim----普里姆算法
取图中任意一个顶点v作为生成树的根,之后往生成树上添加新的顶点w。所添加的顶点应满足下列条件:在生成树的构造过程中,图中 n 个顶点分属两个集合:已落在生成树上的顶点集U 和尚未落在生成树上的顶点集V-U ,则应在所有连通U中顶点和V-U中顶点的边中选取权值最小的边。之后继续往生成树上添加顶点,直至生成树上含有 n-1 个顶点为止。
设:N =(V,E)是个连通网,另设U为最小生成树的顶点集,TE为最小生成树的边集。
构造步骤:
(1)初始状态:U ={u0},(u0∈V), TE={ },
(2)从E中选择顶点分别属于U、V-U两个集合、且权值最小的边(u0,v0),将顶点v0归并到集合U中,边(u0, v0)归并到TE中;
(3)直到U=V为止。此时TE中必有n-1条边,T=(V,{TE})就是最小生成树。
Prime算法特点: 将顶点归并,与边数无关,适于稠密网。时间复杂度O(eloge),故采用邻接矩阵作为图的存储。