【图的DFS】图的DFS非递归算法
在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;
else
return 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的路径可能不止一种情况,如上述输出表示存在两种情况。
【图的DFS】图的DFS非递归算法的更多相关文章
- 图的 储存 深度优先(DFS)广度优先(BFS)遍历
图遍历的概念: 从图中某顶点出发访遍图中每个顶点,且每个顶点仅访问一次,此过程称为图的遍历(Traversing Graph).图的遍历算法是求解图的连通性问题.拓扑排序和求关键路径等算法的基础.图的 ...
- 转载:一幅图弄清DFT与DTFT,DFS的关系
转载:http://www.cnblogs.com/BitArt/archive/2012/11/24/2786390.html 很多同学学习了数字信号处理之后,被里面的几个名词搞的晕头转向,比如DF ...
- 【数据结构】图的基本操作——图的构造(邻接矩阵,邻接表),遍历(DFS,BFS)
邻接矩阵实现如下: /* 主题:用邻接矩阵实现 DFS(递归) 与 BFS(非递归) 作者:Laugh 语言:C++ ***************************************** ...
- BZOJ 4671 异或图 | 线性基 容斥 DFS
题面 Description 定义两个结点数相同的图 G1 与图 G2 的异或为一个新的图 G, 其中如果 (u, v) 在 G1 与 G2 中的出现次数之和为 1, 那么边 (u, v) 在 G 中 ...
- JAVA实现图的邻接表以及DFS
一:定义邻接表结构储存图 package 图的遍历; //邻接表实现图的建立 //储存边 class EdgeNode { int index; // 习惯了用index,其实标准写法是(adjVer ...
- Paddle Graph Learning (PGL)图学习之图游走类模型[系列四]
Paddle Graph Learning (PGL)图学习之图游走类模型[系列四] 更多详情参考:Paddle Graph Learning 图学习之图游走类模型[系列四] https://aist ...
- HDU5772 String problem 最大权闭合图+巧妙建图
题意:自己看吧(不是很好说) 分析: 网络流:最大权闭合子图. 思路如下: 首先将点分为3类 第一类:Pij 表示第i个点和第j个点组合的点,那么Pij的权值等于w[i][j]+w[j][i](表示得 ...
- 看懂UML类图与时序图
看懂UML类图和时序图 这里不会将UML的各种元素都提到,我只想讲讲类图中各个类之间的关系: 能看懂类图中各个类之间的线条.箭头代表什么意思后,也就足够应对 日常的工作和交流: 同时,我们应该能将类图 ...
- 设计模式——1.概述&UML类图和时序图
声明:本博客设计模式相关文章均整理和修改自网络,原文地址:图说设计模式 学习设计模式的3个层次—— 1.熟悉所有设计模式: 2.能够用代码实现: 3.运用到工作的项目中. 设计模式指导软件开发,学习设 ...
- 看懂UML类图和时序图
看懂UML类图和时序图 这里不会将UML的各种元素都提到,我只想讲讲类图中各个类之间的关系: 能看懂类图中各个类之间的线条.箭头代表什么意思后,也就足够应对 日常的工作和交流: 同时,我们应该能将类图 ...
随机推荐
- python中的缩进问题
python中没有{}来表示代码块,而是用缩进来表示,刚开始写python代码,没有注意缩进,结果各种报错(( ╯□╰ )). 在python中的原则就是同一层次的代码一定要有相同的缩进!!! 从上图 ...
- delphi弹出信息框大全
1. 警告信息框 MessageBox(Handle,'警告信息框','警告信息框',MB_ICONWARNING);2.疑问信息框 MessageBox(Handle,'疑问信息框','疑问信息框' ...
- TensorFlow + Keras 实战 YOLO v3 目标检测图文并茂教程
运行步骤 1.从 YOLO 官网下载 YOLOv3 权重 wget https://pjreddie.com/media/files/yolov3.weights 下载过程如图: 2.转换 Darkn ...
- seq2seq-chatbot:200 行代码实现聊天机器人
Chatbot in 200 lines of code CPU 跑不动 github:https://github.com/zsdonghao/seq2seq-chatbot 更多英文,中文聊天机器 ...
- 通过实例理解 RabbitMQ 的基本概念
先说下自己开发的实例. 最近在使用 Spring Cloud Config 做分布式配置中心(基于 SVN/Git),当所有服务启动后,SVN/Git 中的配置文件更改后,客户端服务读取的还是旧的配置 ...
- 【ASP.NET Core】给中间件传参数的方法
最近博客更新频率慢了些,原因有三: 其一,最近老周每星期六都录 ASP.NET Core 的直播,有些内容在视频里讲过,就不太想在博客里面重复.有兴趣的话可以去老周的微博看,或者去一直播,直播帐号与微 ...
- 图片人脸检测——Dlib版(四)
上几篇给大家讲了OpenCV的图片人脸检测,而本文给大家带来的是比OpenCV更加精准的图片人脸检测Dlib库. 点击查看往期: <图片人脸检测——OpenCV版(二)> <视频人脸 ...
- 使用Vitrualbox虚拟Windows Server 2016系统的一些常见问题
所有的问题都是基于有路由器的网络环境下进行设置的,所有的vitrualbox都是安装在win7或者win2008系统上进行的. 1.无法创建x64系统? 解决方法:1)进入主板bios设置,开启cpu ...
- 配置 docker0 网桥
Docker 服务默认会创建一个 docker0 网桥(其上有一个 docker0 内部接口),它在内核层连通了其他的物理或虚拟网卡,这就将所有容器和本地主机都放到同一个物理网络. Docker 默认 ...
- C++编译连接过程中关于符号表的报错分析
是这样的,在学习郑莉老师的多文件结构和编译预处理命令章节时候,看到书里有这么一张图描述如下:#include指令作用是将指定的文件嵌入到当前源文件中#include指令所在的位置. 然后我就想5_10 ...