TopSort(拓扑排序)中DFS和BFS的应用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/m0_37154839/article/details/85254696

深度优先搜索:
下面图中的数字显示了深度优先搜索顶点被访问的顺序。

为了实现深度优先搜索,首先选择一个起始顶点并需要遵守三个规则:
(1) 如果可能,访问一个邻接的未访问顶点,标记它,并把它放入栈中。
(2) 当不能执行规则1时,如果栈不空,就从栈中弹出一个顶点。
(3) 如果不能执行规则1和规则2,就完成了整个搜索过程。

广度优先搜索:
在深度优先搜索中,算法表现得好像要尽快地远离起始点似的。相反,在广度优先搜索中,算法好像要尽可能地靠近起始点。它首先访问起始顶点的所有邻接点,然后再访问较远的区域。它是用队列来实现的。
下面图中的数字显示了广度优先搜索顶点被访问的顺序。

实现广度优先搜索,也要遵守三个规则:
(1) 访问下一个未来访问的邻接点,这个顶点必须是当前顶点的邻接点,标记它,并把它插入到队列中。
(2) 如果因为已经没有未访问顶点而不能执行规则1时,那么从队列头取一个顶点,并使其成为当前顶点。
(3) 如果因为队列为空而不能执行规则2,则搜索结束。


1.深度优先搜索DFS(递归调用栈实现)

void DFS(graph *G, int v){
    G->setMark(v,VISITED);
    for(int w=G->first(v);w<G->n();w=G->next(v,w))
        if(G->getMark(w)==UNVISITED)
            DFS(G,w);
}


2.广度优先搜索BFS(优先队列实现)

void BFS(graph *G, int  start, Queue<int> *Q)
{
    int v,w;
    Q->enqueue(start);
    G->setMark(start,VISITED);
    while(Q->lenght!=0)
    {
        Q->dequeue(v);
        for(w->G->first(v);w<G->n();w=G->next(v,w))
            if(G->getMark(w)==UNVISITED){
                G->setMark(w)= VISITED;
                Q->enqueue(w);
            }
    }
}

下图摘自严蔚敏的教材:

上面说的是DFS。

我们通常会在u对所有的v搜索完后把vis[u]=0;表示未访问,可能会在另一条路径中访问到u,对此,可以这样理解在没有环的情况下,访问的复杂度算边x->u的

下面说的是BFS。

猜你喜欢

转载自blog.csdn.net/m0_37154839/article/details/85254696