在DFS的递归算法中,DFS框架如下:

1访问起点v0

2依次以v0的未访问的连接点为起点,DFS搜索图,直至图中所有与v0路径相通的顶点都被访问。

3若该图为非连通图,则图中一定还存在未被访问的顶点,选取该顶点为起点,重复上述DFS过程,直至图中全部顶点均被访问过为止。

而在非递归的DFS框架中,运用栈来取代递归(递归的本质就是入栈出栈),所以用自定义的栈取代递归栈,具体框架如下:

1首先初始化待使用栈,然后将第一个结点入栈

2然后只要栈不空,重复下面的操作:将栈顶元素弹出,然后看该元素是否访问过

3若没访问过,则访问,置访问标记,然后将该元素的所有相邻顶点入栈(注意是全部,所以应用一个for或while循环来判断哪些元素该入栈)

4重复2,直至全部顶点均被访问过。

基于上述思路代码如下:

  1. #include<iostream>
  2. using namespace std;
  3. typedef struct node
  4. {
  5. int t;
  6. struct node *pnext;
  7. }node,*pnode;
  8. void init(pnode s)
  9. {
  10. s->pnext=NULL;
  11. }
  12. void push(pnode s,int x)
  13. {
  14. pnode ptemp=(pnode)malloc(sizeof(node));
  15. ptemp->t=x;
  16. ptemp->pnext=s->pnext;
  17. s->pnext=ptemp;
  18. }
  19. void pop(pnode s,int *x)
  20. {
  21. pnode ptemp=s->pnext;
  22. *x=ptemp->t;
  23. s->pnext=ptemp->pnext;
  24. free(ptemp);
  25.  
  26. }
  27. bool isEmpty(pnode s)
  28. {
  29. pnode p=s->pnext;
  30. if(NULL==p)
  31. return true;
  32. else
  33. return false;
  34. }
  35. node s;
  36. const int M=4;
  37. int visit[M];
  38. int arc[M][M]={{0,1,0,0},{1,0,1,0},{0,1,0,1},{0,0,1,0}};
  39.  
  40. void dfs(int g[][M],int v)
  41. {
  42. init(&s);//使用自定义栈之前对栈进行初始化
  43. push(&s,v);
  44. while(!isEmpty(&s))
  45. {
  46. pop(&s,&v);
  47. if(!visit[v])
  48. {
  49. cout<<v<<' ';
  50. visit[v]=true;
  51. for(int k=0;k<M;k++)
  52. {
  53. if(!visit[k]&&g[v][k]==1)
  54. {
  55. push(&s,k);
  56. }
  57. }
  58. }
  59. }
  60.  
  61. }
  62. void DFS(int g[M][M],int v)
  63. {
  64. printf("%d ",v);
  65. visit[v]=true;
  66. for(int k=0;k<M;k++)
  67. {
  68. if(!visit[k]&&(g[v][k])==1)
  69. DFS(g,k);
  70. }
  71. }
  72. void main()
  73. {
  74. dfs(arc,2);
  75. for(int i=0;i<M;i++)
  76. {
  77. visit[i]=0;
  78. }
  79. cout<<'\n';
  80. DFS(arc,2);
  81. cout<<'\n';
  82. for(int i=0;i<M;i++)
  83. {
  84. visit[i]=0;
  85. }
  86. dfs(arc,2);//求以顶点2为起点的DFS路径
  87. }

程序运行结果如下:

上述输出结果为以顶点2为起点的DFS路径,注意DFS的路径可能不止一种情况,如上述输出表示存在两种情况。

【图的DFS】图的DFS非递归算法的更多相关文章

  1. 图的 储存 深度优先(DFS)广度优先(BFS)遍历

    图遍历的概念: 从图中某顶点出发访遍图中每个顶点,且每个顶点仅访问一次,此过程称为图的遍历(Traversing Graph).图的遍历算法是求解图的连通性问题.拓扑排序和求关键路径等算法的基础.图的 ...

  2. 转载:一幅图弄清DFT与DTFT,DFS的关系

    转载:http://www.cnblogs.com/BitArt/archive/2012/11/24/2786390.html 很多同学学习了数字信号处理之后,被里面的几个名词搞的晕头转向,比如DF ...

  3. 【数据结构】图的基本操作——图的构造(邻接矩阵,邻接表),遍历(DFS,BFS)

    邻接矩阵实现如下: /* 主题:用邻接矩阵实现 DFS(递归) 与 BFS(非递归) 作者:Laugh 语言:C++ ***************************************** ...

  4. BZOJ 4671 异或图 | 线性基 容斥 DFS

    题面 Description 定义两个结点数相同的图 G1 与图 G2 的异或为一个新的图 G, 其中如果 (u, v) 在 G1 与 G2 中的出现次数之和为 1, 那么边 (u, v) 在 G 中 ...

  5. JAVA实现图的邻接表以及DFS

    一:定义邻接表结构储存图 package 图的遍历; //邻接表实现图的建立 //储存边 class EdgeNode { int index; // 习惯了用index,其实标准写法是(adjVer ...

  6. Paddle Graph Learning (PGL)图学习之图游走类模型[系列四]

    Paddle Graph Learning (PGL)图学习之图游走类模型[系列四] 更多详情参考:Paddle Graph Learning 图学习之图游走类模型[系列四] https://aist ...

  7. HDU5772 String problem 最大权闭合图+巧妙建图

    题意:自己看吧(不是很好说) 分析: 网络流:最大权闭合子图. 思路如下: 首先将点分为3类 第一类:Pij 表示第i个点和第j个点组合的点,那么Pij的权值等于w[i][j]+w[j][i](表示得 ...

  8. 看懂UML类图与时序图

    看懂UML类图和时序图 这里不会将UML的各种元素都提到,我只想讲讲类图中各个类之间的关系: 能看懂类图中各个类之间的线条.箭头代表什么意思后,也就足够应对 日常的工作和交流: 同时,我们应该能将类图 ...

  9. 设计模式——1.概述&UML类图和时序图

    声明:本博客设计模式相关文章均整理和修改自网络,原文地址:图说设计模式 学习设计模式的3个层次—— 1.熟悉所有设计模式: 2.能够用代码实现: 3.运用到工作的项目中. 设计模式指导软件开发,学习设 ...

  10. 看懂UML类图和时序图

    看懂UML类图和时序图 这里不会将UML的各种元素都提到,我只想讲讲类图中各个类之间的关系: 能看懂类图中各个类之间的线条.箭头代表什么意思后,也就足够应对 日常的工作和交流: 同时,我们应该能将类图 ...

随机推荐

  1. Vue2学习结合bootstrapTable遇到的问题

    Vue2学习 项目中在使用bootstrapTable的时候,在table里面会有操作结合vue使用过程中点击相应的操作不会起作用 解决办法 1.把事件绑定到父元素上即可,但要判断什么样的需要点击,用 ...

  2. jvm(三):对象

    关于对象,我们需要面对的问题主要有对象的创建,对象在内存中的布局,对象的结构,对象的访问定位. 对象的创建 对象的创建过程如下图所示: 其主要步骤有:给对象分配内存,初始化对象,执行构造方法. 在对象 ...

  3. Windows上安装scapy

    1. 环境: (1) 操作系统:win7 .server2012 (2) Python版本:Python3.6-64bit (3) 依赖模块Npcap(推荐) 或WinPcap.   ps:从logo ...

  4. Struts+Hibernate+jsp页面,实现分页

    dao层代码 package com.hanqi.dao; import java.util.ArrayList; import java.util.List; import org.hibernat ...

  5. 41. First Missing Positive(困难, 用到 counting sort 方法)

    Given an unsorted integer array, find the first missing positive integer. For example, Given [1,2,0] ...

  6. RandomAccessFile&IO流&排序&方法论

    RandomAccessFile&IO流&排序&方法论 我们总觉得历史是极其遥远的东西,与我们并无关联,又觉得历史隐藏在图书馆的旧书之中. 然而,我们每个人都有真真切切的历史. ...

  7. ActiveMQ消息传递的两种方式

    1.什么是ActiveMQ? ActiveMQ是apache提供的开源的,实现消息传递的一个中间插件,可以和spring整合,是目前最流行的开源消息总线,ActiveMQ是一个完全支持JMS1.1和J ...

  8. LintCode题解之斐波纳契数列

    直接使用递归的方法会导致TLE,加个缓存就好了: public class Solution { private Integer[] buff = new Integer[1000]; /* * @p ...

  9. 02_版本控制工具SVN

    SubVersion: 安装:根据电脑版本选择安装64或32位的subversion,尽量不要选择中文或者有空格的目录安装 版本控制仓库: 创建命令:SVNadmin create 目录 启动SVN服 ...

  10. MongoDB 查询分析

    MongoDB 查询分析可以确保我们建议的索引是否有效,是查询语句性能分析的重要工具. MongoDB 查询分析常用函数有:explain() 和 hint(). 使用 explain() expla ...