检查是否存在包含一组 N 个节点的路径
Check if path exists that contains a set of N nodes
给定一个图 g
和一组 N 个节点 my_nodes = [n1, n2, n3, ...]
,我如何检查是否存在包含所有 N 个节点的路径?
随着图的增长,在 all_simple_paths
中检查包含 my_nodes
中所有节点的路径在计算上变得很麻烦
上面的搜索可以限制在 my_nodes
对之间的路径。这只会在很小的程度上降低复杂性。再加上它需要很多 python 循环,这很慢
有没有更快的解决方法?
你可以在这里尝试一些贪心算法,从所有节点开始路径查找检查来查找,并逐步探索你的图。无法提供一些真实的示例,但伪代码应该是这样的:
- 从所有
n
节点开始 n
路径存根以查找
- 对于所有这些路径存根,由之前未检查过的所有邻居调整它们
- 如果路径存根之间有一些交集,那么您会得到一个新路径,它确实包含比以前更多的所需节点
- 如果在合并存根路径后您有一个涵盖所有需要的节点的路径,那么您就完成了
- 如果还有一些额外的节点要添加到路径中,您再次继续第二步
- 如果图中没有剩余节点,则路径不存在
此算法具有复杂性 O(E + N)
,因为您要以非递归方式访问边和节点。
然而,在有向图的情况下,"merge" 会稍微复杂一些,但仍然可以完成,但在这种情况下,最坏的情况可能会花费很多时间。
更新:
正如你所说的图是有向的,上面的方法是行不通的。在这种情况下,您可以像这样简化您的任务:
- 如果您需要一些开箱即用的解决方案,请找到 strongly connected components in graph (I suggest you to implement it by yourself, e.g., Kosaraju's algorithm). The complexity is
O(E + N)
. You can use a NetworkX method for this。
- 根据步骤1的信息,创建图的浓缩,并保存有关可以从其他组件访问的信息。同样,这里有一个 NetworkX method。
- 现在你可以很容易地说,你的集合中的哪些节点在同一个组件中,因此肯定存在包含所有这些节点的路径。
- 之后,您需要检查的是节点的不同组件之间的连接性。例如,您可以获取 topological sort of condensation 并再次检查线性时间。
给定一个图 g
和一组 N 个节点 my_nodes = [n1, n2, n3, ...]
,我如何检查是否存在包含所有 N 个节点的路径?
随着图的增长,在
all_simple_paths
中检查包含my_nodes
中所有节点的路径在计算上变得很麻烦上面的搜索可以限制在
my_nodes
对之间的路径。这只会在很小的程度上降低复杂性。再加上它需要很多 python 循环,这很慢
有没有更快的解决方法?
你可以在这里尝试一些贪心算法,从所有节点开始路径查找检查来查找,并逐步探索你的图。无法提供一些真实的示例,但伪代码应该是这样的:
- 从所有
n
节点开始n
路径存根以查找 - 对于所有这些路径存根,由之前未检查过的所有邻居调整它们
- 如果路径存根之间有一些交集,那么您会得到一个新路径,它确实包含比以前更多的所需节点
- 如果在合并存根路径后您有一个涵盖所有需要的节点的路径,那么您就完成了
- 如果还有一些额外的节点要添加到路径中,您再次继续第二步
- 如果图中没有剩余节点,则路径不存在
此算法具有复杂性 O(E + N)
,因为您要以非递归方式访问边和节点。
然而,在有向图的情况下,"merge" 会稍微复杂一些,但仍然可以完成,但在这种情况下,最坏的情况可能会花费很多时间。
更新:
正如你所说的图是有向的,上面的方法是行不通的。在这种情况下,您可以像这样简化您的任务:
- 如果您需要一些开箱即用的解决方案,请找到 strongly connected components in graph (I suggest you to implement it by yourself, e.g., Kosaraju's algorithm). The complexity is
O(E + N)
. You can use a NetworkX method for this。 - 根据步骤1的信息,创建图的浓缩,并保存有关可以从其他组件访问的信息。同样,这里有一个 NetworkX method。
- 现在你可以很容易地说,你的集合中的哪些节点在同一个组件中,因此肯定存在包含所有这些节点的路径。
- 之后,您需要检查的是节点的不同组件之间的连接性。例如,您可以获取 topological sort of condensation 并再次检查线性时间。