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

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

图的遍历方法一般有两种,第一种是深度优先遍历(Depth First Search),也 有称为深度优先搜索,简称为DFS。第二种是《广度优先遍历(Breadth  First Search)》,也有称为广度优先搜索, 简称为BFS。我们在《堆栈与深度优先搜索》中已经较为详细地讲述了深度优先搜索的策略,这里不再赘述。我们也可以把 图当作一个迷宫,设定一个起始点,走遍所有图的顶点并打上标记,直到访问遍所有的顶点为止。如图7-5-2所示,需要注 意的是结点I 是在从A->H,H->回溯->D,D->I 的时候被访问到的,而且我们是从A开始递归进入下面的路径, 所以会一直回溯到原点A为止表示遍历结束。

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

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

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;

bool visited[MAXVEX];/* 访问标志的数组 */
/* 邻接矩阵的深度优先递归算法 */
void DFS(MGraph MG, int i)
{
    int j;
    visited[i] = true;
    cout << MG.vexs[i] << ' '; /* 打印顶点,也可以其它操作 */
    for (j = 0; j < MG.numVertexes; j++)
        if (MG.arc[i][j] == 1 && !visited[j])
            DFS(MG, j);/* 对为访问的邻接顶点递归调用 */
}
/* 邻接矩阵的深度遍历操作 */
void DFSTraverse(MGraph MG)
{
    int i;
    for (i = 0; i < MG.numVertexes; i++)
        visited[i] = false;/* 初始所有顶点状态都是未访问过状态 */
    for (i = 0; i < MG.numVertexes; i++)
        if (!visited[i])
            DFS(MG, i);/* 对未访问过的顶点调用DFS,若是连通图,只会执行一次*/
}

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

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索算法
, 遍历
, 递归
, 广度优先搜索
, 矩阵
, 图的遍历
, 深度
, 顶点
, 无向图的深度遍历
, 深度图
, 图的深度遍历
, 算法 八数码 优先搜索
, 矩阵dfs算法
优先
,以便于您获取更多的相关知识。

时间: 2024-12-21 22:21:48

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

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

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

图的深度优先遍历算法

前言 图的遍历与前面文章中的二叉树遍历还是存在很大区别的.所谓图的遍历指的是从图中的某一个顶点出发访问图中的其余顶点,并且需要保证每个顶点只被访问一次.由于图比二叉树复杂得多,所以前面二叉树的遍历算法在图中是行不通的.因为对于任意一个顶点来讲,都可能与其余的顶点发生连接.如果不对访问的顶点做一些处理,出发重复访问的几率是很高的.因此,一个基本思想是设置一个标记数组,主要用于标记已经被访问过的顶点.图的遍历算法主要有两种:深度优先遍历和广度优先遍历.本篇文章主要介绍的是深度优先遍历算法. 深度优先

图的深度优先遍历

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

图的深度优先遍历:邻接表实现

这里用邻接表实现图的深度优先遍历,采用递归实现. #include<iostream> using namespace std; #define VERTEXNUM 5//结点数 struct edgenode { int to; int weight; // 边的权值 edgenode *next; }; struct vnode { int from; edgenode *first; }; void createGraph(vnode *adjilist, int start, int

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

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

图的广度优先遍历算法

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

求一个数据结构代码 要有注释 关于图的深度遍历的 要求必修用C语言做出

问题描述 求一个数据结构代码 要有注释 关于图的深度遍历的 要求必修用C语言做出 要求用数据结构 代码后面要有注释 底下的要求一个也不能漏 图的DFS遍历 要求: 1) 先任意创建一个图: 2) 图的DFS的递归和非递归算法的实现 3) 要求用邻接矩阵.邻接表两种结构存储实现 解决方案 http://zhidao.baidu.com/link?url=54LjtF_eA5Ppp2_FHcYL6q32Zhv1-gTcjAcHmXrHyddryApBeq-meV8z40RuGPEfqMxSGGKE6

【算法导论】图的深度优先搜索遍历(DFS)

        关于图的存储在上一篇文章中已经讲述,在这里不在赘述.下面我们介绍图的深度优先搜索遍历(DFS).         深度优先搜索遍历实在访问了顶点vi后,访问vi的一个邻接点vj:访问vj之后,又访问vj的一个邻接点,依次类推,尽可能向纵深方向搜索,所以称为深度优先搜索遍历.显然这种搜索方法具有递归的性质.图的BFS和树的搜索遍历很类似,只是其存储方式不同.         其基本思想为:从图中某一顶点vi出发,访问此顶点,并进行标记,然后依次搜索vi的每个邻接点vj:若vj未被访

数据结构实践——迷宫问题之图深度优先遍历解法

本文是针对[数据结构基础系列(7):图]的实践项目. [项目 - 迷宫问题之图深度优先遍历解法] 设计一个程序,采用深度优先遍历算法的思路,解决迷宫问题. (1)建立迷宫对应的图数据结构,并建立其邻接表表示. (2)采用深度优先遍历的思路设计算法,输出从入口(1,1)点到出口(M,N)的所有迷宫路径. [模型建立] 将迷宫中的每一格作为一个顶点,相邻格子可以到达,则对应的顶点之间存在边相连. 例如,下面的迷宫 在使用数组表示时,用0表示格子是空地,用1表示格子处是墙,对应的矩阵是: int mg