迭代 DFS 与递归 DFS 以及不同的元素顺序

2024-04-19

我编写了一个递归 DFS 算法来遍历图:

void Graph<E, N>::DFS(Node n)
{
    std::cout << ReadNode(n) << " ";

    MarkVisited(n);

    NodeList adjnodes = Adjacent(n);

    NodeList::position pos = adjnodes.FirstPosition();

    while(!adjnodes.End(pos))
    {
        Node adj = adjnodes.ReadList(pos);

        if(!IsMarked(adj))
            DFS(adj);

        pos = adjnodes.NextPosition(pos);
    }
}

然后我使用堆栈编写了迭代 DFS 算法:

template <typename E, typename N>
void Graph<E, N>::IterativeDFS(Node n)
{
    Stack<Node> stack;

    stack.Push(n);

    while(!stack.IsEmpty())
    {
        Node u = stack.Read();

        stack.Pop();

        if(!IsMarked(u))
        {
            std::cout << ReadNode(u) << " ";

            MarkVisited(u);

            NodeList adjnodes = Adjacent(u);

            NodeList::position pos = adjnodes.FirstPosition();

            while(!adjnodes.End(pos))
            {
                stack.Push(adjnodes.ReadList(pos));

                pos = adjnodes.NextPosition(pos);
            }
        }
    }

我的问题是,在一个图中,例如,我输入三个节点“a”,“b”,“c”,带有弧(“a”,“b”)和(“a”,“c”)我的输出是:

'a'、'b'、'c' 具有递归 DFS 版本,并且:

'a'、'c'、'b' 与迭代 DFS 之一。

我怎样才能得到同样的订单?难道我做错了什么?

谢谢你!


两者均有效DFS 算法。 DFS 并不指定您首先看到哪个节点。这并不重要,因为边之间的顺序没有定义[记住:边通常是一个集合]。差异是由于处理每个节点的子节点的方式造成的。

In the 迭代方法:首先插入所有元素进入堆栈 - 然后处理堆栈的头部[这是最后插入的节点] - 因此您处理的第一个节点是最后一个子节点.

In the 递归方法:当你看到每个节点时,你就可以处理它。就这样您处理的第一个节点是第一个子节点.

为了使迭代 DFS 产生与递归 DFS 相同的结果 - 你需要按相反顺序向堆栈添加元素[对于每个节点,首先插入其最后一个子节点,最后插入其第一个子节点]

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

迭代 DFS 与递归 DFS 以及不同的元素顺序 的相关文章

  • 如何将包含 5000 条记录的 Excel 文件插入到 documentDB 中?

    我有一个 Excel 文件 最初约有 200 行 我能够将 Excel 文件转换为数据表 并且所有内容都正确插入到 documentdb 中 Excel 文件现在有 5000 行 在插入 30 40 条记录后不会插入 其余所有行不会插入到
  • Accept() 是线程安全的吗?

    我目前正在用 C 语言为我正在做的课程编写一个简单的网络服务器 我们的一项要求是实现一个线程池来使用 pthread 处理连接 我知道我将如何粗略地执行此操作 在主线程中调用accept并将文件描述符传递给freee线程 但是我的朋友建议了
  • 将图像文件从网址复制到本地文件夹?

    我有该图像的网址 例如 http testsite com web abc jpg http testsite com web abc jpg 我想将该 URL 复制到 c images 中的本地文件夹中 而且当我将该文件复制到文件夹中时
  • 静态类变量与外部变量相同,只是具有类作用域吗?

    在我看来 静态类变量与外部变量相同 因为你只需要declare它在static int x extern int x语句 并在其他地方实际定义它 通常在 cpp 文件中 静态类变量 h file class Foo static int x
  • 无法从 Web api POST 读取正文数据

    我正在尝试从新的 Asp Net Web Api 中的请求中提取一些数据 我有一个像这样的处理程序设置 public class MyTestHandler DelegatingHandler protected override Syst
  • 导出类时编译器错误

    我正在使用 Visual Studio 2013 但遇到了一个奇怪的问题 当我导出一个类时 它会抛出 尝试引用已删除的函数 错误 但是 当该类未导出时 它的行为会正确 让我举个例子 class Foo note the export cla
  • 矩阵向量变换

    我正在编写一个代码来制作软件蒙皮器 骨骼 皮肤动画 并且我正处于 优化 阶段 蒙皮器工作得很好 并且在 Core 上 1 09 毫秒内对 4900 个三角形网格与 22 个骨骼进行蒙皮Duo 2 Ghz 笔记本 我需要知道的是 1 有人可以
  • 默认值 C# 类 [重复]

    这个问题在这里已经有答案了 我在控制器中有一个函数 并且我收到表单的信息 我有这个代码 public Actionresult functionOne string a string b string c foo 我尝试将其转换为类似的类
  • 无法加载文件或程序集“EntityFramework,版本=6.0.0.0”

    我究竟做错了什么 我该如何解决这个问题 我有一个包含多个项目的解决方案 它是一个 MVC NET 4 5 Web 应用程序 在调试模式下启动后调用其中一个项目时 出现此错误 导致此错误的项目具有以下参考 两个都是版本6 0 0 0 应用程序
  • 您可以在一个 Windows Azure 实例上部署多个 Web 应用程序吗?

    是否可以在一个 windows azure 小型计算实例中运行一堆 Web 应用程序 我正在考虑使用 Azure 作为放置一堆处于开发和非生产状态的项目 Web 应用程序 的地方 有些实际上已经被封存了 但我想在某个地方有一个活跃的实例 我
  • 防止GDB中的PLT(过程链接表)断点

    在最新版本的 GDB 中 在库函数调用上设置断点会导致多个实际断点 调用过程链接表 PLT 实际的函数调用 这意味着当调用库函数时 我们每次都会经历两次中断 在以前的 GDB 版本中 只会创建 2 因此您只能得到一次中断 那么问题来了 是否
  • 错误左值需要作为赋值C++的左操作数

    整个程序基本上只允许用户移动光标 如果用户位于给定的坐标范围 2 2 内 则允许用户键入输入 我刚刚提供了一些我认为足以解决问题的代码 我不知道是什么导致了这个问题 你能解释一下为什么会发生吗 void goToXY int int 创建一
  • 使用(linq to sql)更新错误

    我有两个表 通过外键 CarrierID 绑定 Carrier CarrierID CarrierName CarrierID 1 CarrierName DHL CarrierID 2 CarrierName Fedex Vendor V
  • 相当于 C# 中 Java 的“ByteBuffer.putType()”

    我正在尝试通过从 Java 移植代码来格式化 C 中的字节数组 在 Java 中 使用方法 buf putInt value buf putShort buf putDouble 等等 但我不知道如何将其移植到 C 我尝试过 MemoryS
  • 如何获取 QIcon 的文件/资源​​路径

    假设我做了这样的事情 QIcon myIcon resources icon ico 我稍后如何确定该图标的路径 例如 QString path myIcon getPath 问题是 没有getPath 会员 我找不到类似的东西 但肯定有办
  • 使用 Chrome 和 Selenium 设置 LocalStorage

    我正在尝试使用 OpenQA Selenium 和 Chrome 设置本地存储键和值 我认为这相当微不足道 但我似乎无法让它发挥作用 我对 C 很陌生 所以我可能错过了一些东西 无论如何 我有这个功能 public static void
  • 如何设置 CMake 与 clang 交叉编译 Windows 上的 ARM 嵌入式系统?

    我正在尝试生成 Ninja makefile 以使用 Clang 为 ARM Cortex A5 CPU 交叉编译 C 项目 我为 CMake 创建了一个工具链文件 但似乎存在错误或缺少一些我无法找到的东西 当使用下面的工具链文件调用 CM
  • 启动画面后主窗口出现在其他窗口后面

    我有一个带有启动屏幕的 Windows 窗体应用程序 当我运行该应用程序时 启动屏幕显示正常 消失并加载应用程序的主窗体 但是 当我加载主窗体时 它出现在包含该应用程序的 Windows 资源管理器目录下 这是运行启动画面然后运行主窗体的代
  • 新的 .NET 6 控制台模板中的 C# 函数重载不起作用

    我在尝试重载该函数时遇到错误Print object in the 新的 NET 6 C 控制台应用程序模板 https learn microsoft com en us dotnet core tutorials top level t
  • FindAsync 很慢,但是延迟加载很快

    在我的代码中 我曾经使用加载相关实体await FindAsync 希望我能更好地遵守 C 异步指南 var activeTemplate await exec DbContext FormTemplates FindAsync exec

随机推荐

  • Node JS 和 Webpack 意外令牌 <

    我已经开始学习了Node JS 这是我的文件 索引 html div h1 Hello h1 h1 h1 div app js var http require http path require path fs require fs co
  • 替换 Pandas 系列给定条件中的值

    这是一个微不足道的问题 我只是无法找到明确的答案 我有一个系列对象 random pd Series np random randint 10 10 我想将所有大于 1 的值替换为 0 我该如何执行此操作 我试过了 Random repla
  • iOS 捏合缩放和两指同时旋转

    这是我的代码 视图加载 UIPinchGestureRecognizer pinch UIPinchGestureRecognizer alloc initWithTarget self action selector pinch self
  • Applescript 从同一目录运行 bash 脚本

    我正在尝试构建一个 AppleScript 来启动我的 shell 脚本 路径结构如下 Users ryan myscript applescript scpt bash sh 我的AppleScript如下 tell applicatio
  • glDrawElements 在 PyOpenGL 中绘制立方体

    我最近开始通过 Python 学习 OpenGL 这要归功于几个教程 尤其是 Nicolas P Rougier 的教程 http www labri fr perso nrougier teaching opengl http www l
  • Inno Setup 选择一个目录来安装预定义集中的文件

    在这种情况下 我需要将文件安装到特定目录 但在不同的计算机上它可能位于不同的文件夹中 所以我需要检查哪个是正确的 例如 我有一个文件 需要将其安装在A文件夹或B文件夹或C文件夹 取决于计算机有A or B or C 所以我需要先检查一下计算
  • TFS 重新成为孙子

    几天来我一直在尝试一切我能想到的方法来让它发挥作用 无基础的合并 重新设置父级 分支然后重新设置父级 我想重新设置一个分支的父级 使其成为其中一个子级的子级 并打破该分支与其父级之间的关系 在下图中 我想将 Cassidy Main 和 B
  • Android 获取日期并插入到文件名

    我有一个非常烦人的问题 我想获取当前日期 时间并将其插入文件名中 但我一生都无法让它工作 我想获取 2011 11 18 12 13 57 的时间 然后将其插入到我的文件名中 文件名 2011 11 18 12 13 57 tar gz 我
  • 如何通过单击超链接打开文件

    我有这张桌子 我想单击链接 文件 无论什么文件 将在新的弹出窗口中打开 这是我的代码
  • 将 SVG 从文件加载到画布并取消分组

    我使用 FabricJS 和函数将 SVG 文件上传到画布 fabric loadSVGFromURL url function objects options group fabric util groupSVGElements obje
  • Linux 上共享串口

    我正在使用 Raspberry Pi 进行一个项目 该项目需要能够写入和读取串行端口 但来自不同的程序 程序 A 需要能够从外围设备 A 正在发送数据的串行端口读取数据 程序B需要向串口写入数据 外设B正在监听串口 供参考 本例中程序A是G
  • 将 matlab 中的 find() 转换为 python

    我正在将代码从 Matlab 转换为 Python Matlab中的代码为 x find sEdgepoints gt 0 sNorm lt lowT sEdgepoints x 0 两个数组的大小相同 我基本上是在创建一个掩码 I rea
  • Xcode 14.0 - PackageIndex.findPackages 失败:featureDisabled 警告

    自从我升级到 Xcode 14 0 后 我收到以下警告 PackageIndex findPackages failed featureDisabled 网络搜索没有得到任何结果 我有一个SPM包 但似乎没有任何问题 有人知道如何摆脱这个警
  • 如何在部署的appengine数据库上的eclipse中调试服务器代码?

    我在 Eclipse 中有一个 Google AppEngine Java 项目 我想在 Eclipse 中调试本地代码 但使用 AppEngine 上部署的数据库 到目前为止 我使用带有用户名 密码的远程 API 旧方式 此方法将被弃用
  • 如何获取批处理文件中的字符串长度?

    似乎没有一种简单的方法可以获取批处理文件中字符串的长度 例如 SET MY STRING abcdefg SET A MY STRING LEN 我如何找到字符串的长度MY STRING 如果字符串长度函数处理字符串中所有可能的字符 包括转
  • Chrome 扩展 + 网页视图

    我正在努力寻找这个问题的明确答案 除 Chrome 操作系统外 所有操作系统均已弃用 Chrome 应用 只能在 Chrome 应用中使用 这意味着我不能或不应该在扩展中使用 如果可能 根据进一步的研究 测试和评论 绝对不能在扩展中使用 只
  • postbuild UIAutomation 脚本未在 jenkins 中运行

    我正在尝试做端到端自动化 for an iOS项目 我的目标是自动化持续集成处理与附加UIAutomation脚本作为构建后操作 因此 从用户在 SVN 中检查他的代码开始 直到我们得到自动化测试结果 一切都将是自动化的 Jenkins安装
  • 使用 fb_graph Ruby gem 从 Facebook 检索好友位置

    我正在尝试使用 gem 检索用户所有朋友的位置 fb graph https github com nov fb graph 版本1 7 2 我的权限是 发布流 读取好友列表 离线访问 好友位置 用户位置 我已经对用户进行了身份验证并存储了
  • “不支持”在不指定 RuntimeIdentifier 的情况下构建或发布独立的应用程序

    使用最新的 Visual Studio 2019 我尝试发布 DotNetCore 3 1 WPF 应用程序的 Msix 安装程序 应用程序构建并正确运行 但是当我尝试发布应用程序时出现此错误 It is not supported to
  • 迭代 DFS 与递归 DFS 以及不同的元素顺序

    我编写了一个递归 DFS 算法来遍历图 void Graph