您的位置:首页 > 其它

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

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