深度优先搜索(DFS)的基础理解与实现

简介: 深度优先搜索(DFS)的基础理解与实现

深度优先搜索(DFS)的基础理解与实现

深度优先搜索(Depth-First Search,简称DFS)是一种用于遍历或搜索树或图的算法。这种算法会尽可能深地搜索树的分支。当节点v的所在边都已被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止。

下面是一个简单的DFS实现:

#include<bits/stdc++.h>
using namespace std;
const int N = 10;
int n;
int st[N];
int a[N];
void dfs (int u)
{
    if (u == n)
    {
        for (int i = 0; i < n; ++ i) cout << a[i] << " ";
        puts("");
        return;
    }
    for (int i = 1; i <= n; ++ i)
    {
        if (!st[i])
        {
            a[u] = i;
            st[i] = true;
            dfs (u + 1);
            st[i] = false;
        }
    }
}
int main()
{
    cin >> n;
    dfs (0);
    return 0;
}

在这段代码中,我们定义了一个数组st来记录每个节点是否被访问过,a数组用来记录每次DFS搜索的结果。dfs函数是DFS的主体部分,参数u代表当前正在访问的节点。

在dfs函数中,首先检查当前节点是否是目标节点(u == n),如果是,则打印出当前的搜索结果并返回。如果不是,我们就遍历所有的节点,对于每个未被访问过的节点,我们将其标记为已访问,然后从这个节点开始进行DFS,DFS结束后,我们需要将这个节点的状态重置为未访问。

相关文章
|
2月前
|
存储 算法 Java
【DFS(深度优先搜索)详解】看这一篇就够啦
本文介绍了深度优先搜索(DFS)算法及其应用。DFS从某个顶点出发,深入探索图的每条路径,直到无法前进为止,然后回溯。文章详细解释了DFS的基本思想,并通过示例图展示了其执行过程。此外,文中还探讨了三种枚举方式:指数型枚举、排列型枚举和组合型枚举,并提供了具体的代码实现。最后,文章通过几道练习题帮助读者更好地理解和应用DFS算法。
1509 19
【DFS(深度优先搜索)详解】看这一篇就够啦
|
存储 前端开发 算法
深度优先搜索(DFS)和广度优先搜索(BFS)
深度优先搜索(DFS)和广度优先搜索(BFS)
120 0
DFS(深度优先搜索)和BFS(宽度优先搜索)
DFS(深度优先搜索)和BFS(宽度优先搜索)
79 0
|
算法
DFS深度优先搜索
DFS深度优先搜索
|
算法 C语言
经典算法之深度优先搜索(DFS)
经典算法之深度优先搜索(DFS)
经典算法之深度优先搜索(DFS)
|
存储 算法 PHP
深度优先搜索(DFS)
深度优先搜索(DFS)
236 0
深度优先搜索(DFS)
|
算法
【和zqy学算法】Day1:DFS与BFS
【和zqy学算法】Day1:DFS与BFS
150 0
|
算法 Java
java实现图的深度优先搜索(DFS)和广度优先搜索(BFS)
深度优先搜索、宽度优先搜索算法属于图算法的一种。
660 0
java实现图的深度优先搜索(DFS)和广度优先搜索(BFS)
|
存储 机器学习/深度学习 人工智能
一文搞懂深度优先搜索、广度优先搜索(dfs、bfs)
你问一个人听过哪些算法,那么深度优先搜索(dfs)和宽度优先搜索(bfs)那肯定在其中,很多小老弟学会dfs和bfs就觉得好像懂算法了,无所不能,确实如此,学会dfs和bfs暴力搜索枚举确实利用计算机超强计算大部分都能求的一份解,学会dfs和bfs去暴力杯混分是一个非常不错的选择!
224 0
一文搞懂深度优先搜索、广度优先搜索(dfs、bfs)
|
存储 C++
C++实现图 - 02 图的遍历(DFS、BFS)
上一讲我们对图有了一个大概的了解,但是只讲了如何存储图,还没有讲如何遍历图。这一讲我们来介绍图的遍历方式,一共分为深度优先搜索(DFS)和宽度优先搜索(BFS)。
526 0
C++实现图 - 02 图的遍历(DFS、BFS)