DFS 深度优先搜索
2011-12-28 21:47
204 查看
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
深度优先搜索算法需要了解深度优先遍历的执行过程,本文中利用一个栈来模拟递归实现中系统设置的工作栈,算法的伪代码描述为:
(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; }
相关文章推荐
- 算法学习笔记11-DFS深度优先搜索
- 步步为营(十五)搜索(一)DFS 深度优先搜索
- 深度优先搜索DFS/广度优先搜索BFS的一个应用实例(华为编程大赛赛题)
- 【BFS】广度优先搜索&【DFS】深度优先搜索
- Sticks POJ1011 hdu1455 (深度优先搜索DFS)
- Oil Deposits(深度优先搜索DFS)
- nyoj 部分和问题(深度优先搜索DFS)
- 深度优先搜索DFS——图邻接表表示
- ACM-ZOJ 2412 DFS 深度优先搜索
- poj3009之深度优先搜索 dfs解法
- 深度优先搜索(DFS)
- 深度优先搜索 dfs Oil Deposits HDU - 1241
- leetcode 37. Sudoku Solver 一个经典的DFS深度优先搜索的做法
- DFS深度优先搜索遍历
- 【数据结构_图_DFS_1068】深度优先搜索
- 深度优先搜索 DFS(邻接矩阵表示)
- 深度优先搜索DFS-C语言实现、思路/解析-简笔
- 深度优先搜索DFS
- nyoj 部分和问题(深度优先搜索DFS)
- 深度优先搜索 DFS