zoukankan      html  css  js  c++  java
  • [学习记录]DFS思路详解

    [学习记录]DFS思路详解

    深度优先搜索(DFS)

    深度优先搜索在搜索过程中访问某个顶点后,需要递归地访问此顶点的所有未访问过的相邻顶点。 初始条件下所有节点为白色,选择一个作为起始顶点,按照如下步骤遍历:

    a. 选择起始顶点涂成灰色,表示还未访问

    b. 从该顶点的邻接顶点中选择一个,再寻找邻接结点的邻接结点,一直深入下去,直到一个顶点没有邻接结点了,涂黑它,表示访问过了

    c. 回溯到这个涂黑顶点的上一层顶点,再找这个上一层顶点的其余邻接结点,继续如上操作,如果所有邻接结点往下都访问过了,就把自己涂黑,再回溯到更上一层。

    d. 上一层继续做如上操作,知道所有顶点都访问过。

    来道例题吧:

    1.初始状态,从顶点1开始

    1.初始状态,从顶点1开始

    2.依次访问过顶点1,2,3后终止于顶点3

    3.从顶点3回溯到顶点2,继续访问顶点5,并且终止于顶点5

    4.从顶点5回溯到顶点2,并且终止于顶点2

    5.从顶点2回溯到顶点1,并终止于顶点1

    6.从顶点4开始访问,并终止于顶点4

    上面的图可以通过如下邻接矩阵表示:

    int maze[5][5] =
    {
        { 0, 1, 1, 0, 0 },
        { 0, 0, 1, 0, 1 },
        { 0, 0, 1, 0, 0 },
        { 1, 1, 0, 0, 1 },
        { 0, 0, 1, 0, 0 }
    };

    DFS实现:

    #include <iostream>
    #define N 5
    using namespace std;
    int maze[N][N] = {
        { 0, 1, 1, 0, 0 },
        { 0, 0, 1, 0, 1 },
        { 0, 0, 1, 0, 0 },
        { 1, 1, 0, 0, 1 },
        { 0, 0, 1, 0, 0 }
    };
    int visited[N + 1] = { 0, };
    void DFS(int start)
    {
        visited[start] = 1;
        for (int i = 1; i <= N; i++)
        {
            if (!visited[i] && maze[start - 1][i - 1] == 1)
                DFS(i);
        }
        cout << start << " ";
    }
    int main()
    {
        for (int i = 1; i <= N; i++)
        {
            if (visited[i] == 1)
                continue;
            DFS(i);
        }
        return 0;
    }

    总的来说,DFS就是:搜索一条路,直到不能走为止,倒退最少步数换另一条路再找。

  • 相关阅读:
    iframe和DataForm
    django文件上传
    MySQL 对于千万级的大表要怎么优化?
    mysql myisam转innodb的2种方法
    mysql 中order by 与group by的顺序
    sql 时间转换问题 from_unixtime() UNIX_TIMESTAMP()
    MySQL大表优化方案
    iptables nat及端口映射
    一个不可思议的MySQL慢查分析与解决
    iptables中DNAT、SNAT和MASQUERADE的理解
  • 原文地址:https://www.cnblogs.com/firstfan/p/10126023.html
Copyright © 2011-2022 走看看