zoukankan      html  css  js  c++  java
  • 算法分析---------------------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;
    }
  • 相关阅读:
    PCLVisualizer::addSphere 运行报错解决方案
    八叉树 (转载)
    Django 迁移错误 Cannot add foreign key constraint,字段类型自动变成Bigint(20)
    Django之Model字段详解
    FineReport如何连接hadoop,hive,Impala数据库,Kerberos认证
    图片自适应容器的几种方法
    【windows】查看电池使用情况
    【C++】C++复合变量的定义及易错点
    【c++】C++自定义类注意事项
    金字塔池化Spatial Pyramid Pooling
  • 原文地址:https://www.cnblogs.com/bq12345/p/3271652.html
Copyright © 2011-2022 走看看