Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
深度优先搜索 (DFS)_创想鸟

深度优先搜索 (DFS)

图的深度优先搜索从图中的一个顶点开始,在回溯之前尽可能访问图中的所有顶点。
图的深度优先搜索类似于树遍历,树遍历中讨论的树的深度优先搜索。对于树,搜索从根开始。在图中,搜索可以从任何顶点开始。

深度优先搜索树首先访问根,然后递归访问根的子树。类似地,图的深度优先搜索首先访问一个顶点,然后递归地访问与该顶点相邻的所有顶点。不同之处在于该图可能包含循环,这可能导致无限递归。为了避免这个问题,你需要跟踪已经访问过的顶点。

该搜索被称为深度优先,因为它尽可能在图中搜索“更深”。搜索从某个顶点 v 开始。访问完 v 后,它会访问 v 的未访问的邻居。如果 v 没有未访问的邻居,则搜索回溯到到达 v 的顶点。我们假设图是连通的,并且搜索开始从任何顶点都可以到达所有顶点。

深度优先搜索算法

深度优先搜索的算法在下面的代码中描述。

输入:g = (v, e) 和起始顶点 v
输出:一棵以 v 为根的 dfs 树 1 树 dfs(顶点 v){
2 访问 v;
v 的每个邻居 w 为 3 个 4 if (w 还没有被访问过) {
5 将 v 设置为树中 w 的父级;
6 dfs(w);
7 }
8 }

您可以使用名为

isvisited

的数组来表示某个顶点是否已被访问。最初,对于每个顶点 i,isvisited[i] 为false。一旦访问了某个顶点(例如 v),isvisited[v] 就会设置为 true.考虑下图 (a) 中的图表。假设我们从顶点 0 开始深度优先搜索。首先访问 0,然后访问它的任何邻居,比如 1。现在访问 1,如下图 (b) 所示。顶点 1 有三个邻居:0、2 和 4。由于 0 已经被访问过,因此您将访问 2 或 4。让我们选择 2。现在 2 被访问,如下图 (c) 所示。顶点 2 有 3 个邻居:0、1 和 3。由于 0 和 1 已经被访问过,所以选择 3。现在访问 3,如下图 (d) 所示。至此,顶点已按以下顺序被访问过:

纳米搜索 纳米搜索

纳米搜索:360推出的新一代AI搜索引擎

纳米搜索 30 查看详情 纳米搜索 0

、1、2、3由于 3 的所有邻居都被访问过,所以回溯到 2。由于 2 的所有顶点都被访问过,所以回溯到 1。4 与 1 相邻,但 4 还没有被访问过。因此,访问4,如下图(e)所示。由于 4 的所有邻居都已访问过,因此回溯到 1。

由于 1 的所有邻居都已访问过,所以回溯到 0。由于 0 的所有邻居都已访问过,因此搜索结束。

深度优先搜索 (DFS)由于每条边和每个顶点仅被访问一次,因此

dfs

方法的时间复杂度为o(|e| + |v|),其中|e|表示边数,|v | 顶点数量。 深度优先搜索的实现

上面代码中的dfs算法使用了递归。很自然地使用递归来实现它。或者,您可以使用堆栈。

dfs(int v)

方法在 abstractgraph.java 中的第 164-193 行实现。它返回 tree 类的实例,以顶点 v 作为根。该方法将搜索到的顶点存储在列表searchorder(第165行)中,将每个顶点的父级存储在数组parent(第166行)中,并使用isvisited数组来指示某个顶点是否已被访问(第166行) 171)。它调用辅助方法 dfs(v,parent, searchorder, isvisited) 来执行深度优先搜索(第 174 行)。在递归辅助方法中,搜索从顶点

u

开始。 u 在第 184 行添加到 searchorder 并标记为已访问(第 185 行)。对于u的每个未访问的邻居,递归调用该方法来执行深度优先搜索。当访问顶点e.v时,e.v的父顶点存储在parent[e.v]中(第189行)。当访问连通图或连通组件中的所有顶点时,该方法返回。

深度优先搜索 (DFS)下面的代码给出了一个测试程序,显示上图中从芝加哥开始的图的 dfs。从芝加哥出发的dfs示意图如下图所示

public class TestDFS {    public static void main(String[] args) {        String[] vertices = {"Seattle", "San Francisco", "Los Angeles", "Denver", "Kansas City", "Chicago", "Boston", "New York", "Atlanta", "Miami", "Dallas", "Houston"};        int[][] edges = {                {0, 1}, {0, 3}, {0, 5},                {1, 0}, {1, 2}, {1, 3},                {2, 1}, {2, 3}, {2, 4}, {2, 10},                {3, 0}, {3, 1}, {3, 2}, {3, 4}, {3, 5},                {4, 2}, {4, 3}, {4, 5}, {4, 7}, {4, 8}, {4, 10},                {5, 0}, {5, 3}, {5, 4}, {5, 6}, {5, 7},                {6, 5}, {6, 7},                {7, 4}, {7, 5}, {7, 6}, {7, 8},                {8, 4}, {8, 7}, {8, 9}, {8, 10}, {8, 11},                {9, 8}, {9, 11},                {10, 2}, {10, 4}, {10, 8}, {10, 11},                {11, 8}, {11, 9}, {11, 10}        };        Graph graph = new UnweightedGraph(vertices, edges);        AbstractGraph.Tree dfs = graph.dfs(graph.getIndex("Chicago"));        java.util.List searchOrders = dfs.getSearchOrder();        System.out.println(dfs.getNumberOfVerticesFound() + " vertices are searched in this DFS order:");        for(int i = 0; i < searchOrders.size(); i++)            System.out.print(graph.getVertex(searchOrders.get(i)) + " ");        System.out.println();        for(int i = 0; i < searchOrders.size(); i++)            if(dfs.getParent(i) != -1)                System.out.println("parent of " + graph.getVertex(i) + " is " + graph.getVertex(dfs.getParent(i)));    }}

在此 dfs 顺序中搜索 12 个顶点:

芝加哥 西雅图 旧金山 洛杉矶 丹佛

堪萨斯城 纽约 波士顿 亚特兰大 迈阿密 休斯顿 达拉斯
西雅图的父母是芝加哥
旧金山的父母是西雅图
洛杉矶的父母是旧金山
丹佛的父母是洛杉矶
堪萨斯城的父母是丹佛
波士顿的父母是纽约
纽约的父母是堪萨斯城
亚特兰大的父母是纽约
迈阿密的父母是亚特兰大
达拉斯的父母是休斯顿
休斯顿的父母是迈阿密

深度优先搜索 (DFS) dfs的应用

深度优先搜索可以用来解决很多问题,例如:

检测图是否连通。从任意顶点开始搜索图。如果搜索到的顶点数与图中的顶点数相同,则该图是连通的。否则,图形未连接。检测两个顶点之间是否存在路径。寻找两个顶点之间的路径。找到所有连接的组件。连通分量是最大连通子图,其中每对顶点都通过路径连接。检测图中是否存在环路。在图中找到一个循环。找到哈密顿路径/循环。图中的哈密尔顿路径是只访问图中每个顶点一次的路径。 哈密尔顿循环 只访问图中的每个顶点一次,然后返回到起始顶点。前六个问题可以使用abstractgraph.java中的dfs方法轻松解决。要找到哈密顿路径/循环,您必须探索所有可能的 dfs,以找到通向最长路径的路径。哈密​​顿路径/循环有很多应用,包括解决著名的骑士之旅问题。

以上就是深度优先搜索 (DFS)的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/498425.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
“BOSS直聘崩了”冲上热搜,官方回应:短时间刷新所致
上一篇 2025年11月8日 19:10:48
tp5.0 的模型类型转换问题
下一篇 2025年11月8日 19:10:55

相关推荐

  • Java语法基础中static关键字可以修饰哪些内容

    static关键字用于定义类成员,包括静态变量(如计数器)、静态方法(如工具方法)、静态代码块(类加载时执行)和静态内部类(不依赖外部类实例),均属于类而非对象,通过类名访问,提升成员至类级别实现共享与提前使用。 static 关键字在 Java 中主要用于定义与类相关而非与对象实例相关的成员。它不…

    2026年9月24日
    100
  • 强制联网! 《战地6》单人战役模式无法离线游玩

    强制联网! 《战地6》单人战役模式无法离线游玩强制联网! 《战地6》单人战役模式无法离线游玩强制联网! 《战地6》单人战役模式无法离线游玩强制联网! 《战地6》单人战役模式无法离线游玩

    《战地6》本有机会打破近年来游戏行业普遍采用的“光盘仅附激活码”的做法——这一次,所有游戏内容都被完整地刻录在了实体光盘中。然而令人失望的是,即便如此,玩家若想体验单人战役,依然必须保持网络连接。 这一设定带来了诸多问题。对于只想沉浸于单人剧情、无意参与多人对战的玩家来说,他们仍需和数百万在线用户一…

    2026年9月24日 • 用户投稿
    000
  • 全模组电源比非模组电源好在哪里?

    全模组电源优势在于线材管理、升级便利和系统整洁。其线材可自由拆装,减少冗余,提升散热与走线美观;支持多平台共用和单独更换线材,便于升级与故障处理;适合追求整洁与DIY的用户,虽价格较高但灵活性更强。 全模组电源相比非模组电源,主要优势体现在线材管理、升级便利性和整体系统整洁度上。它并不是在性能或效率…

    2026年9月24日
    100
  • 抖音怎么看注册时间?怎么看百度网盘注册时间

    抖音已然成为国内炙手可热的短视频平台之一。凭借其独特的智能推荐系统,用户能够在短时间内找到自己喜爱的内容。你是否知道,你的抖音注册时间实际上隐含了许多关于你的社交轨迹的信息呢?本文将带领大家一同揭秘抖音注册时间背后的故事。 一、抖音注册时间的意义 1. 用户活跃程度的体现 抖音注册时间能够帮助我们判…

    2026年9月24日
    100
  • mysql中*是什么意思 mysql星号通配符解析

    在 mysql 中,星号()最常用于 select 语句中代表所有列,但应谨慎使用。1)它方便查看所有数据,但可能返回不必要的数据,影响性能。2)使用可能降低代码可维护性,建议明确列出所需列。3)在like操作符中,不是通配符,需用regexp。4)在视图中使用可能导致定义失效。5)可结合limit…

    2026年9月24日
    000
  • 为什么要4k对齐

    早期硬盘的每个扇区以512字节为标准,而新一代硬盘的扇区容量则为4096个字节,即所谓的4k扇区。虽然硬盘标准已经更新,但操作系统仍然使用512字节扇区的标准。为了确保兼容性,硬盘制造商将4k扇区模拟成了512字节扇区。文件系统的块(簇)通常是512字节的倍数,而新系统大多设定为4k的倍数,例如li…

    2026年9月24日
    000
  • Yii框架的验证器:如何确保输入数据的正确性

    yii框架是一款高效、快速的php框架,提供了丰富的功能和组件,使开发者能够快速构建web应用程序。其中,验证器是yii框架中一个非常重要的组件,可以确保输入数据的正确性。本文将介绍yii框架的验证器是如何工作的,以及如何使用验证器来确保输入数据的正确性。 Yii框架验证器的工作原理 在Yii框架中…

    用户投稿 2026年9月24日
    100
  • 罗技gpw鼠标驱动如何调节DPI?罗技gpw鼠标驱动调节DPI的方法

    罗技gpw鼠标驱动如何调节DPI?罗技gpw鼠标驱动调节DPI的方法罗技gpw鼠标驱动如何调节DPI?罗技gpw鼠标驱动调节DPI的方法罗技gpw鼠标驱动如何调节DPI?罗技gpw鼠标驱动调节DPI的方法罗技gpw鼠标驱动如何调节DPI?罗技gpw鼠标驱动调节DPI的方法

    罗技gpw鼠标驱动专为gpw打造,提供毫秒级响应速度,支持一键关闭板载模式后自由调节dpi。在灵敏度设置界面中,只需拖动滑块即可精准调整当前dpi值,并可最多预设4个档位,通过鼠标上的dpi按键实现快速切换。 罗技gpw鼠标驱动如何调节DPI?详细操作步骤如下: 首先使用数据线将鼠标连接至电脑,并在…

    2026年9月24日 • 用户投稿
    200
  • 1-6月乘用车HUD标配装配量TOP20车型:问界M9第四

      近日,有机构公布了2025年1至6月国内乘用车hud功能标配装配量top20车型。其中,理想l6、l7、l8、l9和问界m9、m8等车型装配率(装配率=装配量/零售量)均为100%。此外,6月国内hud标配装配率接近20%。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 …

    2026年9月24日
    800
  • mac怎么合并访达窗口_mac Finder窗口合并技巧

    可通过“窗口”菜单中的“合并所有窗口”命令将多个访达窗口整合为标签页;2. 也可手动拖动窗口标题栏至另一窗口顶部标签栏以创建标签页;3. 结合Control+上箭头进入台前调度,可辅助分组管理并优化多窗口操作体验。 如果您在使用Mac时打开了多个“访达”窗口,导致桌面显得杂乱,可以通过合并窗口的方式…

    2026年9月24日
    000
  • realmeQ系列应用删不了怎么办?教你解决系统应用的卸载难题

    无法卸载realme Q系列预装应用时,首先尝试通过应用信息页面卸载;若失败,可前往软件商店修复或更新;仍无效则进入安全模式卸载;最后检查设备管理权限并清除数据缓存以解除限制。 如果您尝试从realme Q系列手机中删除某个应用,但发现无法完成卸载操作,这通常是因为该应用属于系统预装程序或具有特殊权…

    2026年9月24日
    000
  • Yii框架中的认证授权:保护应用程序安全

    随着互联网的快速发展,安全问题成为越来越多公司和组织关注的话题。在这个时代中,任何一个应用程序都可能面临黑客、恶意软件和其他安全威胁。为此,开发者需要采取措施来保护应用程序的安全性能。本文将介绍 yii框架中的认证和授权功能,以帮助开发者保证其应用的安全性。 Yii框架的认证和授权功能 Yii框架提…

    用户投稿 2026年9月24日
    200
  • 抖音怎么下载视频?抖音怎么提取别人的视频

    抖音作为一个热门的短视频社交平台,凭借其多样化的短视频内容吸引了众多用户。部分用户在浏览抖音视频时,希望能将其保存下来以供后续观看。那么,如何在抖音上下载视频呢?接下来,本文将详细介绍几种下载抖音视频的方法以及相关的注意事项。 一、抖音视频下载方法 使用抖音官方提供的下载功能 抖音自身具备下载功能,…

    2026年9月24日
    400
  • google浏览器怎么把网页保存为PDF_google浏览器网页保存为PDF方法

    使用Chrome将网页保存为PDF,首先按Ctrl+P进入打印界面,选择“另存为PDF”并调整设置后保存;也可通过F12打开开发者工具,截取指定元素或完整页面截图后转为PDF;还可安装“Save as PDF”等扩展程序实现更高质量的导出。 如果您希望将当前浏览的网页完整保存以便离线查看或分享,Go…

    2026年9月24日
    000
  • windows怎么关闭cortana进程_彻底关闭小娜(cortana)后台进程的方法

    1、可通过任务管理器结束Cortana进程并禁用其启动项;2、修改注册表或组策略可永久关闭;3、重命名系统目录文件夹可阻止其运行。 如果您发现Windows系统中Cortana(小娜)后台进程占用资源或影响系统性能,可能是该服务在后台持续运行。以下是彻底关闭Cortana进程的操作步骤: 本文运行环…

    2026年9月24日
    800
  • 苹果过时产品名单更新,M5 iPad Pro 开箱视频流出

    苹果过时产品名单更新,M5 iPad Pro 开箱视频流出苹果过时产品名单更新,M5 iPad Pro 开箱视频流出苹果过时产品名单更新,M5 iPad Pro 开箱视频流出苹果过时产品名单更新,M5 iPad Pro 开箱视频流出

    日前,苹果已将 iphone 11 pro max 和 apple watch series 3 的所有型号列入“过时产品”(vintage product)行列。 根据苹果的规定,一款产品在停止销售满 5 年后,可能会被归为“过时产品”。不过,这一分类并不会显著影响售后服务——苹果仍会继续为这些设…

    2026年9月24日 • 用户投稿
    600
  • VSCode如何实现AI版本迁移辅助 VSCode跨版本升级的智能建议

    vscode的“ai版本迁移辅助”并非独立功能,而是通过扩展兼容性检查、设置同步、lsp/dap协议支持及社区资源等生态能力协同实现;2. 升级后扩展无法工作时,应检查更新日志、尝试降级或重新安装扩展、禁用冲突扩展、查看控制台错误信息并向作者报告问题;3. 备份设置和扩展列表可通过启用设置同步、手动…

    2026年9月24日
    1000
  • 星痕共鸣捏脸码怎么用 星痕共鸣捏脸数据使用方法

    星痕共鸣捏脸码怎么用 星痕共鸣捏脸数据使用方法星痕共鸣捏脸码怎么用 星痕共鸣捏脸数据使用方法星痕共鸣捏脸码怎么用 星痕共鸣捏脸数据使用方法星痕共鸣捏脸码怎么用 星痕共鸣捏脸数据使用方法

    星痕共鸣捏脸码导入位置说明 1、具体操作:在进入角色捏脸界面后,左下角会显示【下载】与【分享】两个功能按钮。点击【下载】即可输入他人提供的捏脸码,快速导入并应用对应的角色外观。 2、此外,玩家也可以通过【分享】生成自己的捏脸数据编码,供其他玩家使用。若对当前形象不满意,还可使用【生体重构剂】道具将角…

    2026年9月24日 • 用户投稿
    600
  • php-gd怎样处理图像异常_php-gd图像处理错误捕获

    PHP-GD 图像处理需主动捕获警告、检查返回值、预验证文件类型并调整内存限制,通过错误处理器和异常封装避免崩溃。 PHP-GD 库在处理图像时,可能会因为文件格式错误、内存不足、不支持的图像类型或函数调用不当等原因导致异常。由于 GD 函数大多不会抛出异常,而是返回 false 或产生警告,因此需…

    2026年9月24日
    100
  • 德系豪华品牌集体投“华” 是什么让BBA放下了身段?

    德系豪华品牌集体投“华” 是什么让BBA放下了身段?德系豪华品牌集体投“华” 是什么让BBA放下了身段?德系豪华品牌集体投“华” 是什么让BBA放下了身段?德系豪华品牌集体投“华” 是什么让BBA放下了身段?

      【小编科技】当德系豪华车徽章与中国科技基因交融,当国资巨头的生产线接入鸿蒙神经中枢,当售价20万元的汽车装上百万级智驾系统——华为正以”技术赋能者”的姿态重构产业格局,成为名副其实的行业顶流。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 Deep…

    2026年9月24日 • 用户投稿
    500

发表回复

登录后才能评论
关注微信