在有向循环图中查找所有可能的路径

时间:2012-08-30 15:59:28

标签: c++ c data-structures graph

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

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

Graph Image

2 个答案:

答案 0 :(得分:3)

让我们采用图表中显示的这种常见模式:

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

原谅ASCII艺术。因此,您有三条路径:A -> DA -> B -> DA -> B -> C -> D

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

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

您拥有与以前相同的三条路径:D -> GD -> E -> GD -> E -> F -> 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 可能的路径,通过那些简单的节点。

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

答案 1 :(得分:0)

您可以尝试以下操作:

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