【图的DFS】图的DFS非递归算法
2016-03-11 15:41
253 查看
在DFS的递归算法中,DFS框架如下:
1访问起点v0
2依次以v0的未访问的连接点为起点,DFS搜索图,直至图中所有与v0路径相通的顶点都被访问。
3若该图为非连通图,则图中一定还存在未被访问的顶点,选取该顶点为起点,重复上述DFS过程,直至图中全部顶点均被访问过为止。
而在非递归的DFS框架中,运用栈来取代递归(递归的本质就是入栈出栈),所以用自定义的栈取代递归栈,具体框架如下:
1首先初始化待使用栈,然后将第一个结点入栈
2然后只要栈不空,重复下面的操作:将栈顶元素弹出,然后看该元素是否访问过
3若没访问过,则访问,置访问标记,然后将该元素的所有相邻顶点入栈(注意是全部,所以应用一个for或while循环来判断哪些元素该入栈)
4重复2,直至全部顶点均被访问过。
基于上述思路代码如下:
![](http://img.blog.csdn.net/20160311153833010)
上述输出结果为以顶点2为起点的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的路径可能不止一种情况,如上述输出表示存在两种情况。
相关文章推荐
- 打包测试 之 之 iOS Provisioning Profile(Certificate)与Code Signing详解
- Vulkan入门学习
- Week 8:Unsupervised Learning 第一部分课后习题解答
- 【图的DFS】图的DFS非递归算法
- 最简单的一个win32程序
- 百度地图定位当前地址
- HDOJ 4696 Answers 乱搞
- SpringMvc 笔记
- 微软版的SqlHelper.cs类
- top置顶
- Request failed: unacceptable content-type: text/html
- nexus安装
- linux服务器禁ping和开启ping功能
- 行人检测全局特征中的HOG、LBP、Haar特征整理
- Find a way
- 8VC Venture Cup 2016 - Final Round (Div. 2 Edition)
- ubuntu14.04 安装gstreamer0.10-ffmpeg
- PAT (Advanced Level) Practise 1041 Be Unique (20)
- Oracle定位不知源头的SQL
- Android Quantity Strings 的 getQuantityString方法取值问题