[英]Finding the number of all the shortest paths between two nodes in directed unweighted graph
[英]Finding number of paths between two nodes in a directed acyclic graph
我解决这个问题的想法是调整 DFS 使其在我们到达目标节点时停止,然后设置一个计数器,将起始节点的所有邻居相加,然后递归地将起始节点的邻居及其邻居相加。
我只是想知道这是否只会计算从源到目标的路径,而不计算任何不通向目标节点的杂散路径。
感谢您的帮助。
您可以使用动态规划。 你有一个有向无环图,所以你有一个节点(比如 s),没有指向 s 的弧。 您还有一个节点(比如 t),它没有指向 t 的弧线。 因为它是非循环的,所以您可以使用拓扑排序算法来找到节点的排序,使得每个弧都远离 s 指向 t。
所以从s开始。 从 s 到 s 的路径数为 1,即空路径。 因为该图是无环的,所以 s 必须有一个邻居 u,这样唯一指向 u 的弧就是 su。 现在你只需重复一遍。 一般来说,对于一个节点 w,它的弧从 v1,...vk 指向它。 那么从 s 到 w 的路径数就是 sv1 路径数之和,..., svk 路径数。
这是在每个节点之间的单个弧的情况下。 如果有多个弧相乘,那么它将是(v1w 弧的数量)(sv1path 的数量)+ ... +(vkw 弧的数量)(svk 路径的数量)
并且在每个步骤中,您都可以使用它是非循环的这一事实来找到节点 w,这样您就已经计算了所有 sv1 到 svk 的路径。
我会使用 BFS。
我们称源节点为s
,目标节点为t
。
当您从s
开始 BFS 时,将找到所有长度为 1 的路径并将其放入队列。 然后,您可以获取队列的第一个元素(称为u
)并找到所有大小为 2 的路径( s -> u -> ...
)。 对每个距离重复相同的事情,直到找到从s
到t
的所有长度的所有路径。
加速它的一个技巧是:在你用尽节点w
所有路径后,存储从w
到t
路径有多少条,当另一个节点(高于w
)到达w
,你不需要重新计算所有路径。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.