图的遍历——连通分量

7.3.3 连通分量

连通分量的概念

  1. 对于连通图,从任一顶点出发,只需一次调用深度优先搜索算法或广度优先搜索算法即可访问到图中的所有顶点;
    对于非连通图时,从图中某一顶点出发,一次调用深度优先搜索算法或广度优先搜索算法不可能访问到图中的所有顶点,只能访问到该顶点所在的极大连通子图(即连通分量)的所有顶点。
  2. 非连通图有k个连通分量,就要k次调用DFS或BFS才能访问图中的所有顶点。若从图的每一个连通分量中的一个顶点出发进行搜索,就可以求得图的所有连通分量。
    所谓连通分量,是指非连通图中极大连通子图
  3. 在实际的遍历算法中,需要检测图的每一个顶点:若顶点已被访问过,则该顶点一定是落在图中已求得的连通分量上;若顶点还未被访问,则从该顶点出发遍历图,可求得图的另一个连通分量。图7-4给出一个非连通无向图及其连通分量的示例。对此图进行深度优先遍历或广度优先遍历,将三次调用DFS或BFS过程:第一次从顶点A出发,第二次从顶点F出发。第三次从顶点1出发,最后得到原图的三个连通分量。
    在这里插入图片描述
    对于非连通图的每一个连通分量,其中的所有顶点和用某种遍历方式所经过的边的集合,构成了一棵生成树,这是一个极小连通子图。所有连通分量的生成树组成了非连通图的生成森林,如图7-17(a)和图7-17(b)分别是图7-4所示非连通图的深度优先生成森林和广度优先生成森林。

判断是否连通 代码实现

///广度优先遍历思路
template <class ElemType>
bool BFStestConnect(const AdjMatrixUndirGraph<ElemType> &g, void (*Visit)(const ElemType &))
{
   
    int v,w,count;
    ElemType e;
    for (v = 0; v < g.GetVexNum(); v++)
        g.SetTag(v, UNVISITED); // 对每个顶点作未访问标志
    queue<int> q;
    count=0;//用count记录已经访问过的顶点数

    v=0;//判断是否连通的起始点

    g.SetTag(v, VISITED);						// 作访问标志
	g.GetElem
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值