【图的DFS】图的DFS非递归算法
生活随笔
收集整理的這篇文章主要介紹了
【图的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;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非递归算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微信主题怎么设置皮肤
- 下一篇: 非常不错的文章,囊括啦高性能、高可用的分