什么是DFS

DFS算法,全称为深度优先搜索算法,是一种用于图和树遍历的算法。它的应用范围非常广,比如词语互换游戏、迷宫问题等。

首先,我们来看一下什么是图和树。图就是由节点和边组成的集合,每一个节点表示图中的一个物体,每一条边表示物体之间的联系。树是一种特殊的图,它是由n个节点和n-1条边组成的,其中一个节点没有父节点,其他节点都只有一个父节点。

DFS算法的思想很简单,它就是从一个起点开始,不停地向下遍历,直到找到终点或者无法继续向下遍历为止。换言之,它是一种尽可能深地遍历图或树的算法。

在实现DFS算法时,我们需要使用一个栈来保存当前节点的信息,然后在访问完当前节点后,将下一个需要访问的节点入栈,然后继续遍历下去。

下面我们来看一下DFS算法的C++代码实现:

代码实现

#include <bits/stdc++.h>
using namespace std;

void dfs(int node, vector<int> adj[], bool visited[]) {
    // 标记当前节点已访问
    visited[node] = true;
    cout << node << " ";

    // 遍历当前节点的所有邻居节点
    for (int i = 0; i < adj[node].size(); i++) {
        int neighbor = adj[node][i];

        // 如果邻居节点没有被访问过,则继续遍历
        if (!visited[neighbor]) {
            dfs(neighbor, adj, visited);
        }
    }
}

int main() {
    // 定义节点数和边数
    int n, m;
    cin >> n >> m;

    // 定义邻接表
    vector<int> adj[n+1];

    // 定义每个节点是否被访问过
    bool visited[n+1] = {false};

    // 读入每条边
    for (int i = 0; i < m; i++) {
        int u, v;
        cin >> u >> v;

        // 添加邻居节点
        adj[u].push_back(v);
        adj[v].push_back(u);
    }

    // 从节点1开始进行DFS遍历
    dfs(1, adj, visited);

    return 0;
}

上面的代码实现了从节点1开始遍历图或树的DFS算法,其中adj数组是邻接表,visited数组是记录每个节点是否被访问过的数组。

总结

DFS算法是一种非常基础的算法,它可以解决很多图和树的遍历问题。在实现DFS算法时,需要使用一个栈来保存当前节点信息,然后不停地向下遍历,直到找到终点或者无法继续向下遍历为止。

抽象出DFS的一个通用模板

int check(参数)
{
    if(满足条件)
        return 1;
    return 0;
}
 
void dfs(int step)
{
        判断边界
        {
            相应操作
        }
        尝试每一种可能//如for(i=1;i<=n;i++)
        {
               满足check条件//如if(vis[i]==0)
               标记//如vis[i]=1;
               继续下一步dfs(step+1)
               恢复初始状态(回溯的时候要用到)//如vis[i]=0;
        }
}