算法分析---------------------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;
}
原文地址:https://www.cnblogs.com/bq12345/p/3271652.html