【问题标题】:Find all possible paths in a directed cyclic graph在有向循环图中查找所有可能的路径
【发布时间】:2012-08-30 15:59:28
【问题描述】:

我想在有向循环图中找到所有可能的路径。我编写了一个程序来执行此操作,但我注意到如果节点数增长到 40 或 50 以上,它将开始花费无限时间。

从理论上讲,N 个节点的有向循环图可能有多少条路径。是像阶乘(N) 还是什么?你能给我猜一下下面这个有 119 个节点的例子吗?当然,我只遍历一次循环,所以你可以忽略循环路径。

Graph Image

【问题讨论】:

  • 我已经尝试过深度优先搜索。
  • 此时我有兴趣知道理论极限。
  • 理论极限是基于计算机、架构的,我可以继续。甚至使用了编译器标志。您需要非常详细地分析您的算法。从小案例开始。

标签: c++ c data-structures graph


【解决方案1】:

让我们以图表中显示的这种常见模式为例:

A ---> B
|     /|
|    / v
|   /  C
|  /   |
| /    |
vv    /
D <---

请原谅 ASCII 艺术。所以这里有三个路径:A -&gt; DA -&gt; B -&gt; DA -&gt; B -&gt; C -&gt; D

现在假设您从D 到另一个节点G 有完全相同的数字:

D ---> E
|     /|
|    / v
|   /  F
|  /   |
| /    |
vv    /
G <---

您拥有与以前相同的三个类似路径:D -&gt; GD -&gt; E -&gt; GD -&gt; E -&gt; F -&gt; G

现在,从AG 有多少条路径?

要从AG,您必须从AD。您可以通过以下三种方式之一执行此操作。然后你必须从DG。您可以通过以下三种方式之一执行此操作。这两个选项(ADDG)是相互独立的。因此你有3 * 3 = 9AG 的可能路径。

如果您继续重复该图,则每次重复时将可能路径的数量乘以3。所以用三个数字,27条路径;四个数字,81条路径;等等

这是指数增长。换句话说:如果你想提高效率,就必须找到另一种方法来做你正在做的事情。

编辑:粗略估计:只计算这些数字,甚至不看中间的复杂混乱,我得到3 * 3 * 3 * 3 * (2^8) * (4^8) * 3 * 3 * 2 * 3 = 73383542784 可能的路径,通过那些简单的节点。

编辑:您似乎在进行代码分析。在不确切知道您想要做什么的情况下,我建议将您收集的任何信息整合到那些必须到达的节点(例如节点ADG in我的示例数字)。然后进行搜索,直到您到达必须到达的下一个节点,并在那里收集您的信息。这将防止指数爆炸。

【讨论】:

  • 所以看起来他在 O(n^2) 或 O(n^3) 范围内?
  • 更像是 b^n,其中 b 是分支因子,或从节点传出的边数。
  • 哦.. 对。我的指数/基数切换了。
  • 是的,这也是我的第一列火车,直到我意识到无数条路径。查看图表中倒数第二个节点。
  • @user1018562:不,那是路径的数量,“甚至不看复杂的混乱”
【解决方案2】:

您可以尝试以下方法:

  • 在图表中查找属于每条路径的节点。为此,请按顺序从图中删除节点。每个节点,如果删除,就无法找到路径,就是这样一个节点。你的图表应该有很多这样的。
  • 我无法证明这一点,但应该可以找到这些节点出现在每条路径中的顺序。
  • 将图表拆分为由两个连续强制节点和它们之间的所有节点组成的块
  • 计算每个块的路径数
  • 计算所有路径计数的乘积以获得完整计数。记得使用 GMP 之类的东西来避免数字溢出

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-06
    • 2020-12-09
    • 1970-01-01
    • 2010-10-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多