1,深度优先(DFS):

1,先选择一条边走,有多条边后,再选择一条走,直到无边可走,回退;

2,再选择另一条边走;

3,特点:只要在当前的顶点上面可以有边走到其它顶点,就深入的走下去;

2,深度优先算法:

1,原料:class LinkStack<T>;

2,步骤:

1,将起始顶点压入栈中;

2,弹出栈顶顶点 V,判断是否已经标记(标记:转 2,未标记:转 3);

3,标记顶点 V,并将顶点 V 的邻接顶点压入栈中;

4,判断栈是否为空(非空:转 2,空:结束);

3,深度优先算法示例:

4,深度优先算法流程图:

  1,标记、压入邻接顶点;

5,深度优先算法实现:

 1    /* 实现深度优先算法的函数;核心思想是二叉树先序遍历核心思想(非递归法版本) */
 2     SharedPointer< Array<int> > DFS(int i)
 3     {
 4         DynamicArray<int>* ret = NULL;  // 返回值是一个数组
 5         if( (0 <= i) && (i < vCount()) )  // 参数合法
 6         {
 7             LinkStack<int> s;  // 压入邻接顶点的栈
 8             LinkQueue<int> r;  // 压入遍历值的队列
 9             DynamicArray<bool> visited(vCount());  // 访问标记数组
10
11             /* 将标记里面的值初始化为未有访问 */
12             for(int j=0; j<visited.length(); j++)
13             {
14                 visited[j] = false;
15             }
16
17             s.push(i);  // 初始顶点压入栈中
18
19             while( s.size() > 0 )  // 有顶点就要继续
20             {
21                 int v = s.top();  // 得到栈顶的元素
22
23                 s.pop();  // 弹出栈顶元素
24
25                 if( !visited[v] )  // 顶点未有访问
26                 {
27                     SharedPointer< Array<int> > aj = getAdgacent(v);  // 得到 v 的所有邻接顶点
28
29                     /* 将 v 的所有邻接顶点压入栈中 */
30                     for(int j=aj->length()-1; j>=0; j--)
31                     {
32                         s.push((*aj)[j]);  // 将邻接顶点逐个压入栈中
33                     }
34
35                     r.add(v);  // 将 v 压入队列中
36
37                     visited[v] = true;  // 将 v 标记位已经访问
38                 }
39             }
40
41             ret = toArray(r);  // 将队列转换为数组
42         }
43         else
44         {
45             THROW_EXCEPTION(InvalidParameterException, "Index i is invalid ...");
46         }
47
48         return ret;
49     }

6,深度优先算法实现的测试代码:

 1 #include <iostream>
 2 #include "MatrixGraph.h"
 3
 4 using namespace std;
 5 using namespace DTLib;
 6
 7 int main()
 8 {
 9     MatrixGraph<9, char, int> g;
10    const char* VD = "ABEDCGFHI";
11
12     for(int i=0; i<9; i++)
13     {
14         g.setVertex(i, VD[i]); //设置顶点相关的值为字符串 VD 中的内容
15    }
16
17     g.setEdge(0, 1, 0);  // 无向图、特殊的有向图,所以每个点之间的邻接矩阵对称, 这里权值为 0,只关心是否连接,不关心权值
18     g.setEdge(1, 0, 0);
19     g.setEdge(0, 3, 0);
20     g.setEdge(3, 0, 0);
21     g.setEdge(0, 4, 0);
22     g.setEdge(4, 0, 0);
23     g.setEdge(1, 2, 0);
24     g.setEdge(2, 1, 0);
25     g.setEdge(1, 4, 0);
26     g.setEdge(4, 1, 0);
27     g.setEdge(2, 5, 0);
28     g.setEdge(5, 2, 0);
29     g.setEdge(3, 6, 0);
30     g.setEdge(6, 3, 0);
31     g.setEdge(4, 6, 0);
32     g.setEdge(6, 4, 0);
33     g.setEdge(6, 7, 0);
34     g.setEdge(7, 6, 0);
35     g.setEdge(7, 8, 0);
36     g.setEdge(8, 7, 0);
37
38    SharedPointer< Array<int> > sa = g.DFS(0);
39
40     for(int i=0; i<sa->length(); i++)
41     {
42         cout << (*sa)[i] << " ";
43    }
44
45     return 0;
46 }

7,如何使用二叉树先序遍历的思想遍历图?

1,深度优先思想使用的就是二叉树先序遍历的思想,先序遍历是递归完成的,深度优先算法也可以递归完成;

8,递归法实现深度优先:

1,问题划分;

2,定义功能:DFS(graph, vex)

1,以顶点 vex 为起始顶点深度优先遍历 graph;

3,功能函数代码实现:

 1 /* 定义深度优先算法的递归函数 */
 2 template < typename V, typename E>
 3 void DFS(Graph<V, E>& g, int v, Array<bool>& visited)
 4 {
 5     if( (0 <= v) && (v < g.vCount()) )
 6     {
 7         cout << v << endl;  // 访问的方式是打印
 8
 9         visited[v] = true;  // 设置访问标记
10
11         SharedPointer< Array<int> > aj = g.getAdgacent(v);  // 获取 v 的邻接顶点
12
13         /* v 是否有邻接顶点,有的话就递归进行深度优先算法的遍历 */
14         for(int i=0; i<aj->length(); i++)
15         {
16        /* 如果没有进行访问,就进行深度优先遍历 */
17             if( !visited[(*aj)[i]])
18             {
19                 DFS(g, (*aj)[i], visited);  // 递归调用
20             }
21         }
22     }
23     else
24     {
25         THROW_EXCEPTION(InvalidParameterException, "Index v is invalid ...");
26     }
27 }

  4,深度优先代码实现:

 1 /* 递归法深度优先遍历图,第一个参数是要被遍历的图,第二个参数是遍历的起始顶点 */
 2 template < typename V, typename E >
 3 void DFS(Graph<V, E>& g, int v)
 4 {
 5 DynamicArray<bool> visited(g.vCount());  // 标记顶点是否被访问过
 6
 7     /* 为每一个顶点设置是否被访问的初始值 */
 8     for(int i=0; i<visited.length();i++)
 9     {
10         visited[i] = false;
11 }
12
13     DFS(g, v, visited);
14 }

9,小结:

1,深度优先按照“先序遍历的方式”对顶点进行访问;

2,深度优先算法的核心是栈的使用;

3,深度优先和广度优先的唯一不同在于栈或队列的使用;

4,深度优先算法可以使用递归的方式实现;

1,深度优先使用栈来完成的并且是先序遍历的思想,则可以考虑使用递归的方式来实现;

2,当用栈来实现的时候,可以考虑使用递归;

转载于:https://www.cnblogs.com/dishengAndziyu/p/10926456.html

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

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

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

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

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

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

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

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

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

  5. 《图论》——图的存储与遍历(Java)

    一:图的分类 1:无向图 即两个顶点之间没有明确的指向关系,只有一条边相连,例如,A顶点和B顶点之间可以表示为 <A, B> 也可以表示为<B, A>,如下所示 2:有向图 顶 ...

  6. 实验报告C语言实现图的深度遍历,图的深度优先遍历的C语言实现.pdf

    图的深度优先遍历的C语言实现.pdf 维普资讯 九 江 职 业 技 术 学 院 学 报 JournalofJiujiangVocational&TechnicalCollege 2004.2 ...

  7. 数据结构与算法(7-2)图的遍历(深度优先遍历DFS、广度优先遍历BFS)(分别用邻接矩阵和邻接表实现)

    目录 深度优先遍历(DFS)和广度优先遍历(BFS)原理 1.自己的原理图 2.官方原理图 一.邻接矩阵的深度优先遍历(DFS) 1.原理图 2. 过程: 3.总代码 二.邻接表的深度优先遍历(DFS ...

  8. 数据结构 图的深度优先遍历 C

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! Bool ...

  9. 图 深度优先遍历 广度优先遍历 非递归遍历 图解算法过程

    图的邻接矩阵表示 通常图的表示有两种方法:邻接矩阵,邻接表. 本文用邻接矩阵实现,一是代码量更少,二是代码风格也更贴近C语言.但不论是图的哪种实现方式,其基本的实现思想是不变的. 1:节点的信息,我们 ...

  10. 图的邻接表存储与深度优先遍历代码实现

    Graph.h Vnode结构成员firstarc在定义时赋初值NULL,在Visual Stdio 2013下编译通过,VC6.0就不行(非静态数据成员不能初始化) #include <std ...

最新文章

  1. 十张图解释机器学习的基本概念
  2. 工作总结20190121
  3. 编程之美-求二叉树中节点的最大距离方法整理
  4. 专门入侵检测linux叫什么,入侵检测系统分析及其在Linux下的实现(上)
  5. OpenGL延迟着色之一
  6. 前端学习(2987):vue+element今日头条管理--案例演示
  7. java监控rabbitMq服务状态,spring cloud 的监控turbine-rabbitmq的示例
  8. [专栏精选]UI的自动布局
  9. iOS iPhone官方参考资料明细
  10. hilbert希尔伯特变换
  11. [Linux 文件权限] 持续更新Linux文件权限命令
  12. 秦九韶算法的matlab表示,1.3.2秦九韶算法
  13. 自律的力量 No Excuse: the power of self-discipline
  14. 第九周项目六 三色球问题
  15. 【andriod】设备APP开发之数据就地Excel存储
  16. Windows 鼠标右键注册表位置
  17. Allwinner Camlinux的3g驱动移植
  18. 魔兽插件是用php吗,【图片】手把手教你制作自己的界面【魔兽插件吧】_百度贴吧...
  19. OSChina 周三乱弹 ——我BUG不改完就不抽烟
  20. 程序员最好不要频繁跳槽

热门文章

  1. 9-ICMP报文种类
  2. 三星华为等推折叠屏手机 这家日本小厂意外发财
  3. 谷歌gke_GKE教程:Google Kubernetes引擎入门
  4. 1030. 完美数列(25)-PAT乙级真题
  5. 推荐系统之基于内容推荐
  6. Echarts5.3.2可视化案例-布局篇
  7. 刚体运动中的坐标变换-旋转矩阵、旋转向量、欧拉角及四元数
  8. CSS vw vh详解
  9. 新车被撞折旧费贬值损失怎么算
  10. iOS开发---开发工具简介