【问题标题】:how can i list every path in a directed graph? (C#)如何在有向图中列出每条路径? (C#)
【发布时间】:2010-11-03 03:59:48
【问题描述】:

请指出正确的方向或告诉我要查找什么来解决此问题:

我有一个包含“节点”对象的“树”对象。 (实际上它被称为有向图)。 每个节点都包含字段字符串“名称”和包含下一个节点的“列表”。

如何创建从头节点到脚节点的所有可能节点名称的列表? 每个列表都包含一条从头到脚的路径。从头到脚的节点数始终相同,即:6。

这就是树的样子:

该图应该给我:

list 1: n1,n2,n4,n5,n7,n9,n13.
lsit 2: n1,n2,n4,n6,n8,n9,n13.
list 3: n1,n2,n4,n10,n11,n12,n13

等等。

可以简单地指出我正确的方向吗?我应该使用什么样的递归算法?我应该使用递归方法还是只使用循环? (我需要在 dikstra 算法的结果上使用它。)

【问题讨论】:

  • 那不是真正的树,是吗?
  • 假设这是作业,请尝试解决方案,我们会为您提供帮助。
  • 理想情况下,您会为此使用递归,但如果您在该图上逐个节点访问,您最终会重复路径并进入无限循环!如果您只想处理一次路径,则必须对节点 ID 进行一些检查并退出该路径的递归!

标签: c# list recursion tree


【解决方案1】:

听起来您正在寻找iterator pattern。这应该会让你朝着正确的方向前进......

【讨论】:

  • 迭代器模式既不能在图上工作,也不能在有向图上工作,除非我们有每个图节点只能指向彼此的约束,在这种情况下,我们将有一个单链表。
【解决方案2】:

执行 BFS 或 DFS,并与节点一起跟踪路径。当节点没有更多子节点时,转储路径。请注意,您有一个图/森林而不是一棵树,但我概述的算法将同样有效。

开始使用 BFS:

Step 1. [n1]
Step 2. [n2(n1), n3(n1)]
Step 3. [n3(n1), n4(n1,n2)]
Step 4. [n4(n1, n2), n4(n1, n3)]
Step 5. [n4(n1, n3), n5(n1, n2, n4), n6(n1, n2, n4), n10(n1, n2, n4)]
Step 6. [n5(n1, n2, n4), n6(n1, n2, n4), n10(n1, n2, n4), n5(n1, n3, n4), n6(n1, n3, n4), n10(n1, n3, n4)]

...

等等。最终,您将拥有自己的道路。这将被打印出来。您可以在不需要递归的情况下实现此算法。循环直到数组为空。 有意义吗?

【讨论】:

  • 谢谢,DFS 正是我所需要的。我现在正在用 C# 实现我自己的版本。完成后将在几天后发布,以便其他人使用。
  • 请记住,这只适用于假设您的图形是非循环的,并且只有一个“脚”节点没有出界边。这些似乎是合理的假设,但如果是我,我会在提交作业之前明确说明它们。如果没有这两个假设,问题和解决方案就会更加复杂。
  • 上述解决方案适用于多个脚节点和树的各种深度,只要他在节点上的“列表”为空时打印和删除节点。如果图有循环,则不会终止。
【解决方案3】:

这是一个图表,而不是一棵树。 http://en.wikipedia.org/wiki/Tree_structure

所以...我的指针是,您正在graph theory 中寻找解决方案。如果你被卡住了,围绕这个术语和你的问题有点 google-fu 应该会产生算法来实现。

【讨论】:

  • 在有向图中,边从某处指向某处。您的图表中并非如此。您的图是无向图。
【解决方案4】:

您可能会发现 this wikipedia article 很有帮助 - 它讨论了您可以执行的各种树遍历。但是,很可能您想要的是递归下降,前缀遍历。此外,您描述的结构不是传统的树 - 因为它具有交叉共享的节点 - 它可能是一个图。还有一些graph traversal 算法。请记住,如果图形有循环,您将需要提供某种循环检测来处理终止遍历。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-15
    • 1970-01-01
    • 2014-05-05
    • 2010-10-31
    • 2017-10-21
    • 2016-08-22
    • 2018-10-16
    • 1970-01-01
    相关资源
    最近更新 更多