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

一、深度优先遍历(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. mustache语法 转自小花大方
  2. Resin服务器平台介绍
  3. UA OPTI501 电磁波 LIH介质中的平面波1 平面波的性质
  4. 多选取值_R语言缺失值的处理——回归预测法
  5. Android课程设计倒计时app,单片机课程设计-可调倒计时器.doc
  6. 2018年东北农业大学春季校赛 F wyh的集合【思维】
  7. 1001:Hello,World!
  8. excel统计行数_工程人常用的12个excel和9个wps技巧
  9. 2016专接本c语言真题_云南特岗教师考试真题(中学信息技术)9套(无答案)
  10. getresourceasstream方法_【设计模式】第三篇:一篇搞定工厂模式【简单工厂、工厂方法模式、抽象工厂模式】...
  11. 服务器机柜内手机信号,手机信号强度是什么
  12. VUE 注册验证码页面实例
  13. 【PAT B1019/A1069】数字黑洞
  14. Scratch 3.X中的部分错误汇总
  15. flash百叶窗消失_Flash遮罩特效实例之百叶窗效果
  16. mysql汽车租赁管理系统
  17. java fx 教程_JavaFX快速入门
  18. command a expects \ followed by text
  19. [附源码]JAVA+ssm计算机毕业设计高校请假管理系统(程序+Lw)
  20. python3 zip命令_Python调用zip命令正确操作方法解析

热门文章

  1. 开源源码商城系统盘点
  2. 一文解决Opencv四大经典算子——sobel算子、scharr算子、laplacian算子、canny算子
  3. 中国人海外购房似网购般简单:不看房先付款
  4. DNSPod十问深创投刘辉:产业互联网是烧钱做慈善吗?
  5. java-net-php-python-jsp房屋出租网站-视频演示计算机毕业设计程序
  6. python+selenium实现自动刷新网页
  7. 【BLE】蓝牙抓包器 Ellisys 使用说明
  8. 「云安全」 什么是云访问安全代理(CASB )?
  9. DataPipeline亮相“2021科技助力湾区数字金融发展峰会”,解锁“实时数据管理”密码
  10. 一篇文章学会 SVN