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

1访问起点v0

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

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

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

1首先初始化待使用栈,然后将第一个结点入栈
2然后只要栈不空,重复下面的操作:将栈顶元素弹出,然后看该元素是否访问过
3若没访问过,则访问,置访问标记,然后将该元素的所有相邻顶点入栈(注意是全部,所以应用一个for或while循环来判断哪些元素该入栈)
4重复2,直至全部顶点均被访问过。

基于上述思路代码如下:

#include<iostream>
using namespace std;
typedef struct node
{int t;struct node *pnext;
}node,*pnode;
void init(pnode s)
{s->pnext=NULL;
}
void push(pnode s,int x)
{pnode ptemp=(pnode)malloc(sizeof(node));ptemp->t=x;ptemp->pnext=s->pnext;s->pnext=ptemp;
}
void pop(pnode s,int *x)
{pnode ptemp=s->pnext;*x=ptemp->t;s->pnext=ptemp->pnext;free(ptemp);}
bool isEmpty(pnode s)
{pnode p=s->pnext;if(NULL==p)return true;elsereturn false;
}
node s;
const int  M=4;
int visit[M];
int arc[M][M]={{0,1,0,0},{1,0,1,0},{0,1,0,1},{0,0,1,0}};void dfs(int g[][M],int v)
{init(&s);//使用自定义栈之前对栈进行初始化push(&s,v);while(!isEmpty(&s)){pop(&s,&v);if(!visit[v]){cout<<v<<' ';visit[v]=true;for(int k=0;k<M;k++){if(!visit[k]&&g[v][k]==1){push(&s,k);}}}}}
void DFS(int g[M][M],int v)
{printf("%d ",v);visit[v]=true;for(int k=0;k<M;k++){if(!visit[k]&&(g[v][k])==1)DFS(g,k);}
}
void main()
{dfs(arc,2);for(int i=0;i<M;i++){visit[i]=0;}cout<<'\n';DFS(arc,2);cout<<'\n';for(int i=0;i<M;i++){visit[i]=0;}dfs(arc,2);//求以顶点2为起点的DFS路径
}

程序运行结果如下:

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

转载于:https://www.cnblogs.com/hainange/p/6334084.html

【图的DFS】图的DFS非递归算法相关推荐

  1. 图的深度优先遍历(DFS)和广度优先遍历(BFS)非递归实现C++

    1. 思想 从已发现的顶点集合F中拿出一个顶点,访问该顶点,将该顶点的所有相邻且未被发现的顶点加入F,继续执行上述操作,直至F为空. 若F为栈,则是深度优先,为队列,则是广度优先. 2. 图度优先遍历 ...

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

    很多同学学习了数字信号处理之后,被里面的几个名词搞的晕头转向,比如DFT,DTFT,DFS,FFT,FT,FS等,FT和FS属于信号与系统课程的内容,是对连续时间信号的处理,这里就不过多讨论,只解释一 ...

  3. 网状结构(图)图的存储(邻接矩阵、邻接表)、图的遍历(深度DFS、广度BFS)、图的最短路径

    图 多对多关系 是一种网状数据结构,图是由非空的顶点集合和一个描述顶点之间关系的集合组成 其定义 Graph = (V, E) V={x | x ∈某个数据对象} E = {<u, v> ...

  4. leetcode dfs_深度优先搜索:具有6个Leetcode示例的DFS图遍历指南

    leetcode dfs Have you ever solved a real-life maze? The approach that most of us take while solving ...

  5. 【 MATLAB 】使用 MATLAB 比较占空比不同的周期方波的 DFS 图

    周期方波的表达式我就不提炼了,既然你来看文章了,我就不信你周期方波都不知道. 占空比定义为:L/N,N为周期,下面我们对 L = 5,N = 20: L = 5,N = 40:L = 5,N = 60 ...

  6. leetcode 399. Evaluate Division | 399. 除法求值(图的邻接表,DFS)

    题目 https://leetcode.com/problems/evaluate-division/ 题解 题目看着复杂,实际上是图的 DFS. 例如,已知 a/b, b/c, c/d,想求 a/d ...

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

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

  8. dfs深度优先搜索_图的深度优先搜索(DFS)

    dfs深度优先搜索 Depth First Search (DFS) is an algorithm that searches a graph/tree, in a depth-wise manne ...

  9. 图的深度优先遍历和广度优先遍历_图的深度优先遍历(DFS)与广度优先遍历(BFS)的c语言实现...

    头文件 #pragma warning( disable : 4996)#pragma once#ifndef _GRAPH_H_#define _GRAPH_H_ #define MAX_VERTE ...

  10. 【小算法】图的遍历之深度优先(DFS)

    谈到算法,图的操作是避免不了. 而我们一般谈到图时,又必定会谈到图的遍历. 图的遍历通常有 2 种,深度优先(DFS) 和广度优先(BFS). 本篇博文讲解深度优先(DFS). 图的表示 图有两种表示 ...

最新文章

  1. java 写文件的三种方法比较
  2. TensorFlow从1到2(十三)图片风格迁移
  3. 训练生成对抗网络的过程中,训练gan的地方为什么这里没有detach,怎么保证训练生成器的时候不会改变判别器
  4. golang中map并发读写问题及解决方法
  5. centos升级gcc
  6. Matlab与C/C++/Java的一些区别
  7. 科目三中模拟灯光使用考试常见的错误 广州学车网光大国际驾校学车
  8. 命令行 java文本编辑工具 重载 内存区域 栈 堆
  9. 曝 iPhone 13 系列定价有望下调:起售价或低于 5499 元;TikTok 成为全球收入最高 App|极客头条...
  10. eclipse断点不能下一步_大盘下一步这样走,不能错过
  11. IP6826无线充电底座方案IC芯片,兼容WPC Qi v1.2.4
  12. ERROR: canceling statement due to conflict with recovery
  13. 开发,要谋定而后动。
  14. 目标检测算法——小目标检测相关数据集(附下载链接)
  15. 浅谈AM5728裸板调试
  16. Windows系统怎么查看电脑操作系统位数
  17. 2019.6.1日关于图书馆借来的基本数据分析和挖掘的书
  18. 不可思议的大公司组织结构图
  19. 如何用java代码调用ffmpeg进行视频转码
  20. 北京邮电大学22级信通 实验三 二叉树

热门文章

  1. 2019长安大学ACM校赛网络同步赛 J Binary Number(组合数学+贪心)
  2. 十二省联考2019游记
  3. 【Java学习笔记之十五】Java中的static关键字解析
  4. 数据库事务处理差异:可提交读和重复读区别
  5. MongoDB与python 交互
  6. Tarjan求lca
  7. IT增值服务实践心得体会:企业客户的钱比个人客户好赚得多
  8. Boost::Regex 使用方法 (英文)
  9. 系统服务有多个mysql_windows系统中安装多个Mysql服务
  10. tf.slice解析