算法基础——DFS(深度优先遍历)

来源:互联网 发布:mysql怎么创建索引 编辑:程序博客网 时间:2024/06/03 16:38


算法基础—DFS(深度优先遍历)


brycezou@163.com


1、算法思想


        DFS的基本思想:从图的某个顶点开始,一路向前,当没有新的(未被访问的)顶点可访问时逐层回退,继续去发现新的顶点;直到源点可达的所有顶点都被访问为止。这一过程类似于树的前序遍历。

2、算法代码示例


        本文基于图的邻接表形式,分别给出了递归版本和非递归版本的DFS算法代码。本代码旨在清晰地展示算法细节,而未进行任何优化,请多多包涵。


#include <iostream>#include <vector>#include <stack>using namespace std;//图的邻接表vector<vector<int> > graph;//递归的DFSvector<bool> visited;void dfs_recursive(int here){    cout<<here<<" visited"<<endl;    visited[here] = true;    for(int i = 0; i < graph[here].size(); i++)    {        int next = graph[here][i];        if(!visited[next])            dfs_recursive(next);    }}//非递归的DFSvector<bool> visited_stk;void dfs_stack(int src){    stack<int> stk;    stk.push(src);    visited_stk[src] = true;  //压栈就算是访问过了    cout<<src<<" visited"<<endl;    while(!stk.empty())    {        int curr = stk.top();  //访问栈顶元素        bool allvisited = true;  //栈顶元素的邻居是否全被访问过        for(int i = 0; i < graph[curr].size(); i++)        {            int nbr = graph[curr][i];  //栈顶元素的第i个邻居            if(!visited_stk[nbr])  //如果没被访问过,就压栈并访问            {                stk.push(nbr);                visited_stk[nbr] = true;                cout<<nbr<<" visited"<<endl;                allvisited = false;                break;            }        }        if(allvisited)            stk.pop();    }}int main(int argc, char *argv[]){    cout << "Hello DFS!" << endl;    //图的邻接表    vector<int> n0,n1,n2,n3,n4,n5,n6;    n1.push_back(2);    n1.push_back(4);    n2.push_back(5);    n3.push_back(5);    n3.push_back(6);    n4.push_back(2);    n5.push_back(4);    n6.push_back(6);    graph.push_back(n0);  //占位符    graph.push_back(n1);    graph.push_back(n2);    graph.push_back(n3);    graph.push_back(n4);    graph.push_back(n5);    graph.push_back(n6);    cout<<"dfs with recursive"<<endl;    visited = vector<bool>(graph.size(), false);    for(int i = 1; i < graph.size(); i++)    {        if(!visited[i])            dfs_recursive(i);    }    cout<<endl<<"dfs with stack"<<endl;    visited_stk = vector<bool>(graph.size(), false);    for(int i = 1; i < graph.size(); i++)    {        if(!visited_stk[i])            dfs_stack(i);    }    return 0;}
0 0