我解决这个问题的想法是调整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 -> ...
( 的所有路径。对每个距离重复相同的操作,直到找到从s
到t
的所有长度的所有路径。
加快速度的一个技巧是:在你用尽一个节点的所有路径后w
,存储从w
到t
有多少条路径,当另一个节点(高于w
(到达w
时,你不需要重新计算所有的路径。