博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【图的DFS】图的DFS非递归算法
阅读量:7213 次
发布时间:2019-06-29

本文共 1183 字,大约阅读时间需要 3 分钟。

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

1访问起点v0

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

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

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

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

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

基于上述思路代码如下:

#include
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<
<<' '; visit[v]=true; for(int k=0;k
程序运行结果如下:

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

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

你可能感兴趣的文章
listen&accept函数
查看>>
pfSense book之路由
查看>>
Oracle 口令文件
查看>>
[js高手之路]使用原型对象(prototype)需要注意的地方
查看>>
我的友情链接
查看>>
memcached安装使用以及测试
查看>>
近期项目整理
查看>>
greenplum集群安装与增加节点生产环境实战
查看>>
IOS label和button
查看>>
JavaScript 导出Table数据到Word和Excel
查看>>
求一个数的二进制数中的1的个数
查看>>
Oracle Ksplice如何工作?How does Ksplice work?
查看>>
Mysql 局域网no route to host 解决
查看>>
npm 如何查看一个包的版本信息
查看>>
iBatis 分页
查看>>
mysql生成随机数
查看>>
网络地址简介
查看>>
5.文件系统——文件系统挂载、卸载、自动挂载(mount,loop,umount,fuser)
查看>>
gethostbyname超时,与遇到的一些坑
查看>>
python面向对象编程
查看>>