它是定向的,也可以有循环。如果我想找到从节点0到节点9的所有可能路由,我发现我可以使用深度优先搜索算法,将访问节点列表保留在集合中,以防止周期影响算法。
但是,我还没有能够解决的问题是我如何调整DFS以找到在节点0和节点9之间旅行时可以多次传递哪些节点。
在该示例中,我们可以看到,由于循环,如果从0到9行进,则可以多次访问节点1,5,6和3。但是,我不确定如何在算法中有效实现这一点。
我已经尝试过计算访问节点的次数,但这似乎会导致算法无限迭代。
如何找到有向图中两点之间的所有可能路径,同时找到可以在路上多次访问的点(在循环中)?
答案 0 :(得分:2)
您可以在线性时间内单独完成。
让我们找到强关联组件并缩小它们。现在我们有了一个DAG。
如果组件的大小大于2,则可以传递两次(或更多次)节点,可以从源节点访问该节点,并且可以从该节点访问该节点。
如果你没有指数时间,你可以使用以下事实:如果有一个包含给定节点两次的路径,那么这条路径最多有3n
个顶点(我们来看看)它的两次出现。我们可以切断它们之间的所有循环。我们也可以减少它们之前和之后的所有循环)。
也就是说,您可以继续使用递归解决方案(永不终止),但如果路径中有超过3n
个节点,则总是会终止递归的分支(可能会有更好的约束)比3n
,但这个很容易证明。