您的位置:首页 > 其它

算法分析---------------------DFS算法

2013-08-20 23:10 190 查看
深度优先搜索算法(转)

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

(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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: