DFS 深度优先搜索

来源:互联网 发布:贤者之爱结局知乎 编辑:程序博客网 时间:2024/05/01 09:41
 

http://hi.baidu.com/gropefor/blog/item/3a00b683115b4f98f603a61f.html

深度优先搜索算法需要了解深度优先遍历的执行过程,本文中利用一个栈来模拟递归实现中系统设置的工作栈,算法的伪代码描述为:

(1)初始化栈

(2)输出起始节点,并标记为已访问,将该节点压入栈

(3)While(栈不为空)

a.取得栈顶节点Top,注意不要从站内删除;

b.遍历栈顶节点Top的相邻节点adjacentNode,如果该节点adjacentNode未被标记为已

访问,则

输出节点adjacentNode;

标记adjacentNode为已访问;

把adjacentNode压入栈;

c.如果没有满足条件的相邻节点adjacentNode,将栈顶节点Top出栈;

使用情形:

1.深度优先策略常用于连通图的遍历

2.深度优先策略也广泛应用于寻找一条满足某种条件的路径。

算法的时间复杂度为O(n),其中n为节点个数。

经典实例源码:

1.图的节点遍历(C++,VC6.0/VS2005)=================================================

//////////////////////////////////
//深度优先之节点遍历
//1---5
//|     |
//2---4--6----8
//|          |  
//3------7
// 1 2 3 4 5 6 7 8
//1 0 1 0 0 1 0 0 0
//2 1 0 1 1 0 0 0 0
//3 0 1 0 0 0 0 1 0
//4 0 1 0 0 1 1 0 0
//5 1 0 0 1 0 0 0 0
//6 0 0 0 1 0 0 1 1
//7 0 0 1 0 0 1 0 0
//8 0 0 0 0 0 1 0 0

#include <iostream>#include <stack>using namespace std;//节点数#define M 8//图的矩阵表示int matrix[M][M] = {0, 1, 0, 0, 1, 0, 0, 0,1, 0, 1, 1, 0, 0, 0, 0,0, 1, 0, 0, 0, 0, 1, 0,0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,0, 0, 0, 1, 0, 0, 1, 1,0, 0, 1, 0, 0, 1, 0, 0,0, 0, 0, 0, 0, 1, 0, 0};//访问标记,初始化为0,int visited[M + 1];//graph traverse void GT_DFS(){ visited[1] = 1; stack<int> s; cout<< 1 <<" "; s.push(1); while(!s.empty())                //这里知道图的节点数的话可以用while(--n),可以避免遍历完毕后程序继续回溯 {  int top = s.top();  int i ;  for(i = 1; i <= M; ++i)  {   if(visited[i] == 0 && matrix[top - 1][i - 1 ] == 1)   {    visited[i] = 1;    s.push(i);    cout<<i<<" ";    break;   }  }  if( i == M + 1)  {   s.pop();  } }}int main(){ GT_DFS(); system("pause"); return 0;}


原创粉丝点击