深度优先搜索和广度优先搜索的伪代码

1、深度优先搜索(Depth FirstSearch)

访问方式类似于树的前序遍历,它可以用递归方式定义如下:

(1)选中第一个被访问的顶点;

(2)对这个顶点作已访问过的标志;

(3)依次从顶点的未被访问过的第1,2,3,……,个邻接顶点出发,对他们进行深度优先搜索;

(4)如果还有顶点未被访问,则选中一个起始顶点,转向(2);

(5)所有的顶点都被访问到,则结束。

要注意,有时候我们无法从一个顶点出发访问其他所有顶点。

另外,还需要额外的方法来判断某个顶点是不是已经被访问过了。

伪代码如下:

void DFS(图){

    for(图的所有顶点){

         若该顶点未被访问{

                  dfs(该顶点);

        }

    }

}

上面的dfs(某个顶点)指的是从某个顶点开始进行深度优先搜索,有2种实现方式:

递归实现:

dfs(某个顶点)

{

           访问这个顶点;//可以cout打印,也可以储存在一个vector中

            将这个顶点标记为已访问;

            遍历这个节点的所有邻接节点

            {

                  记某个邻接顶点为p;

                  若(p没被访问过)  dfs(p);

            }

}

栈实现:

栈实现其实跟前面的递归实现是类似的。

dfs(某个顶点)

{

        初始化一个栈,并将这个顶点入栈;

        While(栈非空)

        {

              访问栈顶顶点(记为p);//可以cout打印,也可以储存在一个vector中

              在全局数组中将这个顶点标记为已访问;

              将栈顶顶点出栈;

               遍历p的所有邻接顶点

                {

                       若该顶点没被访问过,入栈;

                }

        }

}

2、广度优先搜索(BFS)

广度优先搜索(BreadthFirst Search)类似于树从根结点出发的层次遍历。访问方式如下:

(1)选中第一个被访问的顶点;

(2)对顶点作已访问过的标志;

(3)依次访问已访问顶点的第1,2,……个未被访问过的邻接顶点,并进行标记;转向(3);

(4)如果还有顶点未被访问,则选中一个起始顶点,转向(2);

(5)所有顶点都被访问到,则结束。

广度优先搜索一般是用队列实现的。同前面一样,也需要方法来表示某个顶点有没有被访问过。广度优先搜索的伪代码如下:

void BFS(图)

{

    for(所有顶点)

    {

              若该顶点未被访问

            {

                  bfs(该顶点);

            }

    }

}

bfs(某个顶点)指的是从某个顶点开始进行广度优先搜索遍历。

bfs(某个顶点)

{

       初始化一个队列queue并将这个顶点放入队列;

      while(queue不为空)

       {

               访问队头顶点s;//可以cout打印,也可以储存在一个vector中

                标记s为已遍历;

               出队pop_front();

                遍历p的所有邻接顶点

                {

                    若该顶点没被访问过,入队;

                }

         }

}


猜你喜欢

转载自blog.csdn.net/qq_26286193/article/details/80256324
今日推荐