• 【图的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<<'
    ';
    	DFS(arc,2);
    	cout<<'
    ';
    	for(int i=0;i<M;i++)
    	{
    		visit[i]=0;
    	}
    	dfs(arc,2);//求以顶点2为起点的DFS路径
    }
    程序运行结果如下:



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


  • 相关阅读:
    酒香也怕巷子深,谈谈前端简历书写技巧。
    谈谈自己对语义化的认识
    服务器向用户返回的状态码和提示信息,常见的有以下一些(方括号中是该状态码对应的HTTP动词)
    Python常用库大全
    Python七大原则,24种设计模式
    Python设计模式(4):行为型
    Python设计模式(3):结构型
    Python设计模式(2):创建型
    python设计模式
    数据库的优化
  • 原文地址:https://www.cnblogs.com/hainange/p/6334084.html
Copyright © 2020-2023  润新知