您的位置:首页 > 其它

【图的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,直至全部顶点均被访问过。

基于上述思路代码如下:

#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的路径可能不止一种情况,如上述输出表示存在两种情况。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: