深度优先遍历,也有称为深度优先搜索,简称为DFS。

深度优先遍历其实就是一个递归的过程,它从图中某个顶点ⅴ出发,访问此顶点,然后从V的未被访问的邻接点出发深度优先遍历图,直至图中所有和V有路径相通的顶点都被访问到。

邻接矩阵方式的深度优先遍历

#include<iostream>
#include<vector>
using namespace std;#define MAXVEX 100//最大顶点数
typedef char VertexType;//顶点类型
typedef int EdgeType;//边上的权值类型
typedef struct
{VertexType vexs[MAXVEX];//顶点表EdgeType arc[MAXVEX][MAXVEX];//邻接矩阵int numVertexte;//当前顶点数int numEdges;//当前边数
}MGraph;void DFS(MGraph G, int i, vector<bool>& visited)
{visited[i] = true;cout << G.vexs[i] << " ";//打印当前节点for (int j = 0; j < G.numVertexte; ++j){if (G.arc[i][j] == 1 && !visited[j])//如果节点i和节点j之间可达,并且节点j未被访问过{DFS(G, j, visited);//则从几点j开始继续深度遍历}}
}
void DFSTraverse(MGraph G)
{vector<bool> visited(G.numVertexte,false);//初始所有的顶点状态都是未访问过的for (int i = 0; i < G.numVertexte; ++i){if (!visited[i])//如果当前节点没被访问过,则从当前节点开始深度遍历{DFS(G, i, visited);}}
}

时间复杂度:

邻接表方式的深度优先遍历

#include<iostream>
#include<vector>
using namespace std;#define MAXVEX 100//最大顶点数
typedef char VertexType;//顶点类型
typedef int EdgeType;//边上的权值类型typedef struct EdgeNode
{int adjvex;//邻接点域,存储该顶点对应的下标EdgeType weight;//用于存储权值,对于非网图可以不需要struct EdgeNode* next;//指向下一个邻接点
}EdgeNode;typedef struct VertexNode //顶点表结点
{VertexType data;//存储顶点信息EdgeNode* firstedge;//指向该顶点的第一个相邻结点
}VertexNode,AdjList[MAXVEX];typedef struct
{AdjList adjList;int numVertexes;//当前顶点数int numEdges;//当前边数
}GraphAdjList;void DFS(GraphAdjList G, int i, vector<bool>& visited)
{EdgeNode* p;visited[i] = true;cout << G.adjList[i].data << " ";p = G.adjList[i].firstedge;while (p){if (!visited[p->adjvex])//如果当前顶点未被访问过,则从当前节点开始深度优先遍历{DFS(G, p->adjvex, visited);}p = p->next;//当前节点的后一个节点}
}void DFSTraverse(GraphAdjList G)
{vector<bool> visited(G.numVertexes, false);//初始所有顶点状态都是未访问过状态for (int i = 0; i < G.numVertexes; ++i){if (!visited[i])//如果当前顶点未被访问过,则从当前节点开始深度优先遍历{DFS(G, i, visited);}}
}

时间复杂度:

如果对图的邻接矩阵或者邻接表不清楚,则可以参考下面这篇博客:

一、图的定义,邻接矩阵和邻接表的实现_瘦弱的皮卡丘的博客-CSDN博客

二、图的遍历——深度优先遍历相关推荐

  1. 三十二、图的创建深度优先遍历(DFS)广度优先遍历(BFS)

    一.图的基本介绍 为什么要有图 前面我们学了线性表和树 线性表局限于一个直接前驱和一个直接后继的关系 树也只能有一个直接前驱也就是父节点 当我们需要表示多对多的关系时, 这里我们就用到了图. 图的举例 ...

  2. 图 之遍历----深度优先遍历0.o

    何为深度优先遍历0.o呢?DFS是图论中的经典算法.其利用深度优先搜索算法可以产生目标图的相应拓扑排序表,利用拓扑排序表可以方便的解决很多相关的图论问题,如最大路径问题等等. 基本思想:(一条路走到底 ...

  3. 邻接矩阵存储图并进行深度优先遍历

    内容: 采用邻接矩阵的形式存储图,进行图的深度优先遍历 步骤: 算法分析: 首先,图的邻接矩阵存储结构,就是用一维数组存储图中顶点的信息,用矩阵表示图中各顶点之间的邻接关系.假设图G=(V,E)有n个 ...

  4. 图的遍历——深度优先遍历与广度优先遍历

    目录 何谓遍历? 图的遍历特点 图的遍历方式 深度优先搜索 过程分析 案例分析: 算法的代码实现 测试案例: 测试结果如下: 遍历非连通图 算法复杂度分析 额外补充 广度优先搜索 过程分析 辅助队列 ...

  5. 图--广度优先遍历/深度优先遍历(c语言实现)

    //不能通过编译,没有引入队列头文件 1 #include<stdlib.h> 2 #define MAX_VERTEX_NUM; 3 typedef int infoType; 4 ty ...

  6. 图 邻接矩阵的深度优先遍历

    void DFS( MGraph Graph, Vertex V, void (*Visit)(Vertex) ) {//访问当前位置 然后递归寻找//当前访问的是V这个结点if (!Visited[ ...

  7. 图的遍历——深度优先搜索+广度优先搜索

    一:图的遍历--深度优先搜索 在本文其他内容中只是大体概括了主要的图论内容,更加详细的代码实现及算法分析在此给出. 深度优先搜索(DFS)类似树的先序遍历. 假设初始状态是图中所有顶点未曾被访问,则深 ...

  8. 【图】深度优先遍历 广度优先遍历

    文章目录 一.广度优先遍历 二.深度优先遍历 深度优先遍历和广度优先遍历是遍历图的两种常见方式,接下来就通过这两种方式来实现一下图具体遍历的过程 当我位于游乐园的景区 A 时,为了玩遍所有的景区我们有 ...

  9. 超详细C语言版数据结构:图的深度优先遍历(推荐收藏)

    文章目录 一.邻接矩阵存储图的深度优先遍历过程分析 二.结果分析 三.C语言编程实现图的深度优先遍历 四.图的遍历及其应用 一.邻接矩阵存储图的深度优先遍历过程分析 对图1这样的无向图,要写成邻接矩阵 ...

  10. [PHP] 算法-邻接矩阵图的广度和深度优先遍历的PHP实现

    1.图的深度优先遍历类似前序遍历,图的广度优先类似树的层序遍历 2.将图进行变形,根据顶点和边的关系进行层次划分,使用队列来进行遍历 3.广度优先遍历的关键点是使用一个队列来把当前结点的所有下一级关联 ...

最新文章

  1. 科技边框_爱旭科技首创双面PERC电池PID FREE解决方案
  2. Anaconda conda常用命令
  3. 亚马逊标题自动抓取_如何为您的家人提供自动Amazon礼品卡津贴
  4. 信息学奥赛C++语言: 队伍调整
  5. 使用ASP.NET Web API和Handlebars的Web模板
  6. 如何重命名图层名称_PS新手教程:教你认识“图层”面板及图层面板的相关操作方法...
  7. python中类的参数怎么传_如何将整个类作为参数传递给另一个类的方法
  8. 旷视产品营销总监吕盟:构建AIoT时代的城市智慧|量子位沙龙回顾
  9. Microsoft Office (2007) Open XML 文件格式
  10. sun end seven game losing streak
  11. Qt中添加静态库.lb,.a和动态库.dll,.so,头文件和.cpp文件
  12. #相关系数r值比较(matlab)
  13. MD5 32位加密
  14. 【沃顿商学院学习笔记】公益创业——07现实可行性细节及成本表Operations RealitiesCost Table
  15. apscheduler使用中的时区问题
  16. python面试题 网络编程和并发(34道题)
  17. 为什么我们求职 找工作 一定要写好简历?
  18. Centos7安装普罗米修斯(Prometheus)监控
  19. Centos7 查看用户和用户组
  20. 关于CodeBlocks下载了带mingw版本的依旧无法编译运行的解决方案

热门文章

  1. python脚本注册服务+pyinstaller打包exe开机自启动服务
  2. PMP第六节:项目进度管理
  3. ThinkPHP6 操作SharePoint
  4. “/”应用程序中的服务器错误(System.Data.OleDb.OleDbException: 操作必须使用一个可更新的查询)
  5. C++使用Socks5协议进行代理上网(四)
  6. 编辑手机pad端调试方法
  7. [手机分享]黑莓手机7系列分享之——黑莓7290
  8. WebService调用接口传参失败问题解决
  9. Android, App常用图标尺寸规范
  10. .net微信开发吐血总结