当前位置:首页 > 技术 > 正文内容

深度优先搜索算法解析与应用

访客 技术 2026年5月26日 3

深度优先搜索算法解析

深度优先搜索(DFS)是一种用于图遍历的算法,其核心思想是从初始顶点出发,尽可能深入访问相邻顶点,直到无法继续为止。以下是DFS的基本实现步骤:

  1. 访问初始顶点。
  2. 从当前顶点选择一个未访问的相邻顶点进行访问。
  3. 重复步骤2,直到当前顶点没有未访问的相邻顶点。
  4. 如果还有未访问的顶点,则从这些顶点中选择一个,重复步骤1-3。

DFS通常使用递归或栈来实现。以下是DFS的典型实现示例:

void dfs(int vertex) {
    visited[vertex] = true;
    for (int neighbor : adj[vertex]) {
        if (!visited[neighbor]) {
            dfs(neighbor);
        }
    }
}

0/1背包问题的DFS解法

0/1背包问题是经典的动态规划问题,也可以通过DFS解决。以下是DFS解法的实现:

#include <iostream>
using namespace std;

int main() {
    int weight[] = {2, 2, 6, 5, 4};
    int value[] = {6, 3, 5, 4, 6};
    int capacity = 10;
    int n = 5;
    int max_value = 0;
    bool selected[5] = {false};

    void backtrack(int index, int current_weight, int current_value) {
        if (index == n) {
            if (current_weight <= capacity && current_value > max_value) {
                max_value = current_value;
            }
            return;
        }

        // 选择不包含当前物品
        backtrack(index + 1, current_weight, current_value);

        // 选择包含当前物品
        if (current_weight + weight[index] <= capacity) {
            selected[index] = true;
            backtrack(index + 1, current_weight + weight[index], current_value + value[index]);
            selected[index] = false;
        }
    }

    backtrack(0, 0, 0);
    cout << "最大价值:" << max_value << endl;
    return 0;
}

迷宫问题的DFS解法

迷宫问题可以通过DFS找到从入口到出口的路径。以下是DFS在迷宫问题中的应用:

#include <iostream>
using namespace std;

const int ROW = 8;
const int COL = 8;
char maze[ROW][COL] = {
    {'O','X','X','X','X','X','X','X'},
    {'O','O','O','O','O','X','X','X'},
    {'X','O','X','X','O','O','O','X'},
    {'X','O','X','X','O','X','X','O'},
    {'X','O','X','X','X','X','X','X'},
    {'X','O','X','X','O','O','O','X'},
    {'X','O','O','O','O','X','O','O'},
    {'X','X','X','X','X','X','X','O'}
};

int dx[] = {-1, 0, 1, 0};
int dy[] = {0, 1, 0, -1};

void dfs(int x, int y) {
    if (x == ROW - 1 && y == COL - 1) {
        maze[x][y] = ' ';
        for (int i = 0; i < ROW; i++) {
            cout << maze[i] << endl;
        }
        return;
    }

    for (int i = 0; i < 4; i++) {
        int nx = x + dx[i];
        int ny = y + dy[i];
        if (nx >= 0 && nx < ROW && ny >= 0 && ny < COL && maze[nx][ny] == 'O') {
            maze[nx][ny] = ' ';
            dfs(nx, ny);
            maze[nx][ny] = 'O';
        }
    }
}

int main() {
    dfs(0, 0);
    return 0;
}

总结

深度优先搜索是一种强大的图遍历算法,广泛应用于路径寻找、迷宫问题和背包问题等领域。通过递归或显式栈的实现,DFS能够有效地解决问题。然而,在处理大规模问题时,需要注意栈溢出的风险,并考虑优化策略。

标签: DFS算法

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。