检查是否存在包含一组N个节点的路径

时间:2017-03-05 20:57:46

标签: python networkx path-finding

给定图g和一组N个节点my_nodes = [n1, n2, n3, ...],如何检查是否存在包含所有N个节点的路径?

  1. all_simple_paths中检查包含my_nodes中所有节点的路径会随着图表的增长而变得计算繁琐

  2. 上述搜索可以限制为my_nodes成对夫妻之间的路径。这仅在很小程度上降低了复杂性。另外,它需要大量的python循环,这很慢

  3. 是否有更快的解决方案?

1 个答案:

答案 0 :(得分:2)

你可以在这里尝试一些贪心算法,从所有节点开始寻找路径查找,并逐步探索你的图形。无法提供一些真实的样本,但伪代码应该是这样的:

  • 从所有n个节点启动n路径存根以查找
  • 对于所有这些路径存根,由
  • 之前未检查过的所有邻居调整它们
  • 如果路径存根之间有一些交集,那么你会得到一个新的路径存根,它确实包含了比以前更多的所需节点
  • 如果在合并存根路径后,您拥有覆盖所有所需节点的存根路径,那么您就完成了
  • 如果还有一些额外的节点要添加到路径中,则再次继续第二步
  • 如果图表中没有剩余节点,则路径不存在

此算法具有复杂性O(E + N),因为您以非递归方式访问边和节点。

然而,在有向图的情况下,"合并"将会更复杂,但仍然会完成,但在这种情况下,最糟糕的情况可能需要很长时间。

<强>更新

正如您所说的那样,上述方法并不适用。在这种情况下,您可以像这样简化您的任务:

  • 在图表中找到strongly connected components(我建议您自己实施,例如Kosaraju's algorithm)。复杂性为O(E + N)。如果您需要一些现成的解决方案,可以使用NetworkX method for this
  • 根据步骤1信息创建图形的缩合,并保存有关可以从其他组件访问哪个组件的信息。同样,这有一个NetworkX method
  • 现在您可以很容易地说,您的集合中的哪些节点位于同一个组件中,因此包含所有这些节点的路径肯定存在。
  • 之后,您需要检查的是节点的不同组件之间的连接。例如,您可以获取topological sort of condensation并再次检查线性时间。