图的遍历是指从图中某一顶点出发,访遍图中其余顶点,且使每一个顶点仅被访问一次。

一、深度优先遍历(Depth First Search)

假设给定图G的初态是所有顶点均未曾访问过。在G中任选一顶点v为初始出发点(源点),则深度优先遍历可定义如下:首先访问出发点v,并将其标记为已访问过;然后依次从v出发搜索v的每个邻接点w。若w未曾访问过,则以w为新的出发点继续进行深度优先遍历,直至图中所有和源点v有路径相通的顶点(亦称为从源点可达的顶点)均已被访问为止。若此时图中仍有未访问的顶点,则另选一个尚未访问的顶点作为新的源点重复上述过程,直至图中所有顶点均已被访问为止。

深度优先遍历是一个递归的过程,类似于树的前序遍历,它的策略是尽可能的对纵深方向进行搜索。

有向网图邻接矩阵DPS代码示例:

    //邻接矩阵DFS算法private static void DFS(AdjacencyMatrix.Matrix matrix, int i){int j;visited[i] = true;System.out.print(matrix.getVexs()[i]);for (j = 0; j < matrix.getVerNum(); j++){if(matrix.getArc()[i][j] > 0 && ! visited[j]&&matrix.getArc()[i][j] != 65535 )DFS(matrix, j);}}//邻接矩阵深度遍历操作private static void DFSTraverse(){adjacencyMatrix.CreateMGraph();mGraph = adjacencyMatrix.matrix;     //图的矩阵表示int i;for (i = 0; i < mGraph.getVerNum(); i++){visited[i] = false;              //是否访问的标志}for(i = 0; i < mGraph.getVerNum(); i++){if(! visited[i]){DFS(mGraph, i);}}}

有向网图邻接表DFS代码示例:

    //邻接表DFS算法private static void DFS(AdjacencyList.AdjacencyGraph graph, int i){AdjacencyList.EdgeNode edgeNode;visited[i] = true;System.out.print(graph.getVertexNodes()[i].getData());edgeNode = graph.getVertexNodes()[i].getFirstEdge();while (edgeNode != null){if(!visited[edgeNode.getAdjvex()]){DFS(graph, edgeNode.getAdjvex());}edgeNode = edgeNode.getNext();}}//邻接表深度遍历操作private static void DFSTraverse(){adjacencyList.CreateList();lGraph = adjacencyList.adjacencyGraph;int i;for(i = 0; i < lGraph.getVertexNum(); i++)visited[i] = false;for (i = 0; i < lGraph.getVertexNum(); i++){if(! visited[i]){DFS(lGraph, i);}}}

对比两种存储结构的DFS算法,邻接矩阵是二维数组,时间复杂度为O(n^2^),邻接表的时间复杂度为O(n+e),e为边数,当点多边少时,邻接表更优。

广度优先遍历(Breadth First Search)

1、从图中某个顶点V0出发,并访问此顶点;
2、从V0出发,访问V0的各个未曾访问的邻接点W1,W2,…,Wk;然后,依次从W1,W2,…,Wk出发访问各自未被访问的邻接点;
3、重复步骤2,直到全部顶点都被访问为止。

广度优先遍历类似于树的层序遍历。树的层序遍历是通过队列实现的,图也同理。

邻接矩阵DFS算法:

    //邻接矩阵BFS算法private static void BFSTraverse(){int i,j;Queue<Integer> queue = new LinkedList<>();for(i = 0; i < mGraph.getVerNum(); i++)visited[i] = false;for (i = 0; i < mGraph.getVerNum(); i++){if(! visited[i]){visited[i] = true;System.out.print(mGraph.getVexs()[i]);queue.add(i);while (! queue.isEmpty()){queue.poll();for (j = 0; j < mGraph.getVerNum(); j++){if(mGraph.getArc()[i][j] > 0 && ! visited[j] && mGraph.getArc()[i][j] != 65535){visited[j] = true;System.out.print(mGraph.getVexs()[j]);queue.poll();}}}}}}

邻接表DFS算法:

    //邻接表BFS算法private static void BFSTraverse(){int i;AdjacencyList.EdgeNode edgeNode;Queue<Integer> queue = new LinkedList<>();for(i = 0; i < lGraph.getVertexNum(); i++){visited[i] = false;}for (i = 0; i < lGraph.getVertexNum(); i++){if(! visited[i]){visited[i] = true;System.out.print(lGraph.getVertexNodes()[i].getData());queue.add(i);while (! queue.isEmpty()){queue.poll();edgeNode = lGraph.getVertexNodes()[i].getFirstEdge();while (edgeNode != null) {if(! visited[edgeNode.getAdjvex()]) {visited[edgeNode.getAdjvex()] = true;System.out.print(lGraph.getVertexNodes()[edgeNode.getAdjvex()].getData());queue.poll();}edgeNode = edgeNode.getNext();}}}}}

深度优先适合目标比较明确,以找到目标为主要目的情况,广度优先更适合在不断扩大遍历范围时找到相对最优解的情况。

本文用到的代码链接

图的遍历(DFS和BFS)相关推荐

  1. (王道408考研数据结构)第六章图-第三节:图的遍历(DFS和BFS)

    文章目录 一:图的深度优先遍历(DFS) (1)回溯算法和DFS A:回溯算法的本质 B:回溯算法的框架 C:全排列 (2)图的DFS A:DFS思想 B:动画演示 C:代码 二:图的广度优先遍历(B ...

  2. 数据结构 --- 图的遍历 DFS、BFS

    什么是DFS.BFS? 一条线走到底,深度优先遍历,每一个顶点只遍历.只打印一次的方式:DFS.BFS 数据结构 --- 图的存储 单纯地把邻接顶点的邻接顶点打印出来,顶点重复遍历,打印多次 从 A→ ...

  3. 图的遍历DFS与BFS(邻接表)

    #include "stdafx.h" #include <iostream> #include <fstream> #include <queue& ...

  4. 【数据结构实验六】图的遍历DFS和BFS

    输入格式: 在第1行输入图的类型,1表示有向图,0表示无向图. 在第2行输入构造图的顶点,个数 N 不超过100.例如:图有5个顶点,则输入ABCDE. 后面 N 行,分别输入与ABCDE顶点相连的顶 ...

  5. dijkstra算法_Python实现图的经典DFS、BFS、Dijkstra、Floyd、Prim、Kruskal算法

    讲在前面的话,图的算法太多,理论知识肯定一篇文章讲不完,关于理论知识大家可以参考教材Sedgewick的<算法>或reference的链接,本文主要还是想在一篇文章中记录六种算法的Pyth ...

  6. dfs时间复杂度_Python实现图的经典DFS、BFS、Dijkstra、Floyd、Prim、Kruskal算法

    讲在前面的话,图的算法太多,理论知识肯定一篇文章讲不完,关于理论知识大家可以参考教材Sedgewick的<算法>或reference的链接,本文主要还是想在一篇文章中记录六种算法的Pyth ...

  7. 图的遍历——DFS(邻接矩阵)

    递归 + 标记 一个连通图只要DFS一次,即可打印所有的点. #include <iostream> #include <cstdio> #include <cstdli ...

  8. 图的遍历 DFS遍历(深学思维)

    前言: 这篇文章还是是为了帮助一些 像我这样的菜鸟 找到简单的题解 问题描述: 马上到寒假了,YHC准备去n大城市游玩.这些城市之间有些有航线,有些没有.由于YHC特别懒,现在他想请一位更更更更更蒟蒻 ...

  9. PTA 地下迷宫探索(图的遍历dfs)

    地道战是在抗日战争时期,在华北平原上抗日军民利用地道打击日本侵略者的作战方式.地道网是房连房.街连街.村连村的地下工事,如下图所示. 我们在回顾前辈们艰苦卓绝的战争生活的同时,真心钦佩他们的聪明才智. ...

最新文章

  1. java sdf.parse_用DateFormat的parse方法验证字符串是否是日期的问题
  2. [转]XCode中修改缺省公司名称/开发人员名称
  3. CCNA2 - Module 2 Exam Answers (05/07/2008 14:30)
  4. 《剑指offer》-- 复杂链表的复制、字符串的排列、数组中出现次数超过一半的数字、连续子数组的最大和
  5. 深入理解操作系统内核架构(送书)!
  6. fastreport 旋转90度_水冷必不可少之90度弯头
  7. java开发保险案例_Java实现双保险线程的示例代码
  8. jquery获取select选择的文本与值
  9. 接口测试实例(jmeter)
  10. 让ubuntu使用root帐号并让winscp以root身份登录
  11. 北京-波士顿-西雅图时间对照表
  12. TensorFlow入门:线性回归
  13. oracle基于脚本的安装失败,脚本建库导致 Oracle 组件未安装故障案例
  14. 手把手教你用python写游戏
  15. 【干货】|800份实战经验PPT免费下载
  16. 用计算机弹九八k的乐谱,完整版儿童歌曲简谱大全.docx
  17. 记录一些 arm64指令的用法
  18. 【持续更新】uni-app学习笔记
  19. 数学符号:等号上面加一个点≐
  20. 物联网概论(IoT)_Chp6 物联网网络服务/IP/DNS/ONS

热门文章

  1. 微软研究院分享:计算机专业求职的正确姿势
  2. java毕业设计——基于java+JSP+sqlserver的智能在线考试信息管理系统设计与实现(毕业论文+程序源码)——智能在线考试信息管理系统
  3. 【数据库02】==== 表的增删改查(基础)
  4. Netty的编解码器
  5. 刘群:基于深度学习的自然语言处理,边界在哪里?
  6. 南华大学计算机学院足球队,南华大学“新生杯”足球赛圆满落幕
  7. 实体知识+字典树辅助jieba的分词(并对三国演义进行简单分析)
  8. Windows SubSystem for Linux(WSL)设置默认和设置默认登陆用户
  9. ubuntu root初始密码设置
  10. 2021GDOI游记