算法研究:图的广度优先遍历

图的遍历和树的遍历类似,我们希望从图中某一顶点出发访遍图中其余顶点,且使每一个顶点仅被访问一次,这一过程 就叫做图的遍历(Traverse Graph)。

图的遍历方法一般有两种,第一种是我们在前面讲过的《深度优先遍历 (Depth First Search)》,也有称为深度优先搜索,简称为DFS。第二种是广度优先遍历(Breadth  First Search), 也有称为广度优先搜索,简称为BFS。我们在《队列与广度优先搜索》中已经较为详细地讲述了广度优先搜索的策略,这里 不再赘述。如果说图的深度优先遍历类似树的前序遍历,那么图的广度优先遍历就类似于树的层序遍历了,我们把图7-5-3 的第一幅图稍微变形成第二幅图所示,这样层次感就更强了,广度优先遍历需要用到队列的操作,可以参考《队列的顺序存 储结构》。

下面只给出邻接矩阵和邻接表存储方式时的图的广度优先遍历的算法代码,没有给出整体可供测试运行的代码,其实只 需要再写一个创建图的函数就可以进行整体测试了,可以参考《邻接矩阵创建图》和《邻接表创建图》

一、如果我 们使用的是邻接矩阵的方式,则代码如下:

typedef char VertexType; /* 顶点类型应由用户定义 */
typedef int EdgeType; /* 边上的权值类型应由用户定义 */

#define MAXSIZE 9 /* 存储空间初始分配量 */
#define MAXEDGE 15
#define MAXVEX 9

typedef struct
{
    VertexType vexs[MAXVEX]; /* 顶点表 */
    EdgeType arc[MAXVEX][MAXVEX];/* 邻接矩阵,可看作边表 */
    int numVertexes, numEdges; /* 图中当前的顶点数和边数 */
} MGraph;

/* 邻接矩阵的广度遍历算法 */
void BFSTraverse(MGraph G)
{
    int i, j;
    Queue Q;
    for (i = 0; i < G.numVertexes; i++)
        visited[i] = false;
    InitQueue(&Q);/* 初始化一辅助用的队列 */

    for (i = 0; i < G.numVertexes; i++)/* 对每一个顶点做循环 */
    {
        if (!visited[i])/* 若是未访问过就处理 */
        {
            visited[i] = true;/* 设置当前顶点访问过 */
            cout << G.vexs[i] << ' '; /* 打印顶点,也可以其它操作 */
            EnQueue(&Q, i);/* 将此顶点入队列 */
            while (!QueueEmpty(Q))/* 若当前队列不为空 */
            {
                DeQueue(&Q, &i);/* 将队对元素出队列,赋值给i */
                for (j = 0 ; j < G.numVertexes; j++)
                {
                    /* 判断其它顶点若与当前顶点存在边且未访问过  */
                    if (G.arc[i][j] == 1 && !visited[j])
                    {
                        visited[j] = true;/* 将找到的此顶点标记为已访问 */
                        cout << G.vexs[j] << ' '; /* 打印顶点 */
                        EnQueue(&Q, j);/* 将找到的此顶点入队列  */
                    }
                }
            }
        }
    }
}

遍历结果为:A B F C G I E D H (上图所示的图结构)

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索算法
, 遍历
, 广度优先搜索
, 矩阵
, visit函数
, 队列
, 图的基本操作
, c++广度优先重拍九宫
, 图的遍历
, 顶点
, 图的深度遍历
, 遍历struts2jsp
, 矩阵dfs算法
, 优先
广度
,以便于您获取更多的相关知识。

时间: 2024-12-03 03:29:14

算法研究:图的广度优先遍历的相关文章

基于Java实现的图的广度优先遍历算法_java

本文以实例形式讲述了基于Java的图的广度优先遍历算法实现方法,具体方法如下: 用邻接矩阵存储图方法: 1.确定图的顶点个数和边的个数 2.输入顶点信息存储在一维数组vertex中 3.初始化邻接矩阵: 4.依次输入每条边存储在邻接矩阵arc中 输入边依附的两个顶点的序号i,j: 将邻接矩阵的第i行第j列的元素值置为1: 将邻接矩阵的第j行第i列的元素值置为1: 广度优先遍历实现: 1.初始化队列Q 2.访问顶点v:visited[v]=1;顶点v入队Q; 3.while(队列Q非空) v=队列

图的广度优先遍历算法

前言 广度优先遍历算法是图的另一种基本遍历算法,其基本思想是尽最大程度辐射能够覆盖的节点,并对其进行访问.以迷宫为例,深度优先搜索更像是一个人在走迷宫,遇到没有走过就标记,遇到走过就退一步重新走:而广度优先搜索则可以想象成一组人一起朝不同的方向走迷宫,当出现新的未走过的路的时候,可以理解成一个人有分身术,继续从不同的方向走,,当相遇的时候则是合二为一(好吧,有点扯了). 广度优先遍历算法的遍历过程 仍然以上一篇图的深度优先遍历算法的例子进行说明,下面是广度优先遍历的具体过程: 从起点0开始遍历

算法-有关图的深度优先遍历问题的学习

问题描述 有关图的深度优先遍历问题的学习 请问,如何学习掌握深搜算法,求推荐例题,经典题目,为了参加ACM 解决方案 http://blog.csdn.net/u014271612/article/details/47705289 可以看一下思想! 解决方案二: 图的深度优先遍历图的深度优先遍历图深度优先遍历 解决方案三: www.codevs.cn 题库->搜索->深度优先搜索

邻接表表示的图的广度优先遍历-Breadth First Search Graph

Breadth First Search Graph eryar@163.com 一.简介 广度优先遍历类似于树的按层次遍历过程. 假设从图中某顶点V出发,在访问了V之后依次访问V的各个未曾访问过的邻接顶点,然后分别从这些邻接点出发依次访问它们的邻接点,并使"先被访问的顶点的邻接点"先于"后被访问的顶点的邻接点"被访问,直到图中所有已被访问的顶点的邻接点都被访问到.到此时图中尚有未被访问的顶点,则另选图中一个未曾访问的顶点作为始点,重复上述过程,直到图中所有顶点都被

C++实现图的邻接表存储和广度优先遍历实例分析_C 语言

本文实例讲述了C++实现图的邻接表存储和广度优先遍历方法.分享给大家供大家参考.具体如下: 示例:建立如图所示的无向图 由上图知,该图有5个顶点,分别为a,b,c,d,e,有6条边. 示例输入(按照这个格式输入): 5 6 abcde 0 1 0 2 0 3 2 3 2 4 1 4 输入结束(此行不必输入) 注:0 1表示该图的第0个顶点和第1个定点有边相连,如上图中的a->b所示       0 2表示该图的第0个顶点和第2个定点有边相连,如上图中的a->c所示       2 3表示该图的

Java实现利用广度优先遍历(BFS)计算最短路径的方法_java

本文实例讲述了Java实现利用广度优先遍历(BFS)计算最短路径的方法.分享给大家供大家参考.具体分析如下: 我们用字符串代表图的顶点(vertax),来模拟学校中Classroom, Square, Toilet, Canteen, South Gate, North Gate几个地点,然后计算任意两点之间的最短路径. 如下图所示: 如,我想从North Gate去Canteen, 程序的输出结果应为: BFS: From [North Gate] to [Canteen]: North Ga

图的深度优先遍历

/* 这是一个图的的深度优先搜索,我参考清华大学 c 语言版 1997年 4月第一版    教材中没有构图的函数CreatGraph(),FirstAdjVex()和NextAdjvex(),我在这里写出来了 .    图的存储结构采用邻接表存储.不过构图时的输入比较复杂,请读者认真读以下说明    说明:    假设有顶点 a(1) b(2) c(3) d(4) e(5)    图如下:                  (1)                  (a)            

PHP实现二叉树的深度优先与广度优先遍历方法_php技巧

本文实例讲述了PHP实现二叉树的深度优先与广度优先遍历方法.分享给大家供大家参考.具体如下: #二叉树的广度优先遍历 #使用一个队列实现 class Node { public $data = null; public $left = null; public $right = null; } #@param $btree 二叉树根节点 function breadth_first_traverse($btree) { $traverse_data = array(); $queue = arr

算法研究:图的深度优先遍历

图的遍历和树的遍历类似,我们希望从图中某一顶点出发访遍图中其余顶点,且使每一个顶点仅被访问一次,这一过程 就叫做图的遍历(Traverse Graph). 图的遍历方法一般有两种,第一种是深度优先遍历(Depth First Search),也 有称为深度优先搜索,简称为DFS.第二种是<广度优先遍历(Breadth  First Search)>,也有称为广度优先搜索, 简称为BFS.我们在<堆栈与深度优先搜索>中已经较为详细地讲述了深度优先搜索的策略,这里不再赘述.我们也可以把