算法分析---------------------DFS算法
深度优先搜索算法(转)
深度优先搜索算法需要了解深度优先遍历的执行过程,本文中利用一个栈来模拟递归实现中系统设置的工作栈,算法的伪代码描述为:
(1)初始化栈
(2)输出起始节点,并标记为已访问,将该节点压入栈
(3)While(栈不为空)
a.取得栈顶节点Top,注意不要从站内删除;
b.遍历栈顶节点Top的相邻节点adjacentNode,如果该节点adjacentNode未被标记为已
访问,则
输出节点adjacentNode;
标记adjacentNode为已访问;
把adjacentNode压入栈;
c.如果没有满足条件的相邻节点adjacentNode,将栈顶节点Top出栈;
使用情形:
1.深度优先策略常用于连通图的遍历
2.深度优先策略也广泛应用于寻找一条满足某种条件的路径。
算法的时间复杂度为O(n),其中n为节点个数。
/* * main.cpp * * Created on: 2013-8-20 * Author: 白强 */ //源码的修改 ////////////////////////////////// //深度优先之节点遍历 //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()) { 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(); //输出结果:1 2 3 7 6 4 5 8 return 0; }