查找有向无环图中两个节点之间的路径数



我解决这个问题的想法是调整DFS,使其在我们到达目标节点时停止,然后设置一个计数器,将起始节点的所有邻居相加,然后是起始节点的邻居及其邻居递归。

我只是想知道这是否只会计算从源到目标的路径,而不是任何不通向目标节点的杂散路径。

谢谢你的帮助。

您可以使用动态规划。你有一个有向无环图,所以你有一个节点(比如说s(,没有指向s的弧。你还有一个节点(比如说t(,它没有指向t的弧。因为它是非循环的,所以您可以使用拓扑排序算法来查找节点的顺序,以便每个弧都指向远离 s 并朝向 t。

所以从 s 开始。从 s 到 s 的路径数为 1,即空路径。因为图是非循环的,所以 s 必须有一个邻居 u,这样指向 u 的唯一弧是 su。现在你只是重复。通常,对于具有来自 v1 的弧的节点 w,...VK指着它。那么从 s 到 w 的路径数正好是 sv1 路径数之和,..., svk 路径。

这是在每个节点之间出现单个弧的情况下。如果有多个弧,则乘以(v1w 弧数((sv1 路径数(+ ... + (vkw 弧数((svk 路径数(

在每一步中,您都可以利用它是非循环的事实来查找节点 w,这样您已经计算了所有 sv1 到 svk 的路径。

我会使用BFS。

我们将源节点称为s,目标节点称为t

当您从s开始 BFS 时,将找到所有长度为 1 的路径并将其放入队列中。然后,您可以获取队列的第一个元素(称为u(并找到大小为 2 (s -> u -> ...( 的所有路径。对每个距离重复相同的操作,直到找到从st的所有长度的所有路径。

加快速度的一个技巧是:在你用尽一个节点的所有路径后w,存储从wt有多少条路径,当另一个节点(高于w(到达w时,你不需要重新计算所有的路径。

最新更新