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

Python 检查是否存在包含一组N个节点的路径,python,networkx,path-finding,Python,Networkx,Path Finding,给定一个图g和一组N个节点my_nodes=[n1,n2,n3,…],我如何检查是否存在包含所有N个节点的路径 在all\u simple\u path中检查包含my\u nodes中所有节点的路径会随着图形的增长而变得计算繁琐 上面的搜索可以限制为my_节点之间的路径成对对。这只在很小程度上降低了复杂性。另外,它需要大量python循环,这相当慢 有更快的解决方案吗?您可以在这里尝试一些贪婪算法,从要查找的所有节点开始路径查找检查,然后逐步探索图形。无法提供一些真实的示例,但伪代码应该是这样的

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

  • all\u simple\u path
    中检查包含
    my\u nodes
    中所有节点的路径会随着图形的增长而变得计算繁琐

  • 上面的搜索可以限制为
    my_节点之间的路径
    成对对。这只在很小程度上降低了复杂性。另外,它需要大量python循环,这相当慢


  • 有更快的解决方案吗?

    您可以在这里尝试一些贪婪算法,从要查找的所有节点开始路径查找检查,然后逐步探索图形。无法提供一些真实的示例,但伪代码应该是这样的:

    • 从所有
      n
      节点启动
      n
      路径存根以查找
    • 对于所有这些路径存根,由之前未检查的所有邻居调整它们
    • 如果路径存根之间存在交集,则会得到一个新的路径存根,它确实包含比以前更多的所需节点
    • 如果在合并存根路径之后,您拥有一个覆盖所有需要的节点的路径,那么就完成了
    • 如果仍有一些其他节点要添加到路径中,请再次继续第二步
    • 如果图中没有剩余节点,则路径不存在
    此算法具有复杂性
    O(E+N)
    ,因为您以非递归方式访问边和节点

    然而,在有向图的情况下,“合并”会稍微复杂一些,但仍然需要完成,但在这种情况下,最坏的情况可能需要很多时间

    更新

    正如您所说,图形是有方向的,上述方法不会很好地工作。在这种情况下,您可以简化任务,如下所示:

    • 在图中查找(我建议您自己实现它,例如,)。复杂度是
      O(E+N)
      。如果您想要一些现成的解决方案,可以使用
    • 根据步骤1信息创建图形的缩聚,并保存有关可以从其他组件访问哪个组件的信息。再一次,这是一个很好的解释
    • 现在您可以很容易地说,集合中的哪些节点位于同一组件中,因此包含所有节点的路径肯定存在
    • 之后,您只需检查节点的不同组件之间的连接。例如,您可以获取并再次执行线性时间检入

    是否正在查找仅包含这N个节点的路径?所有N个节点,可能还有一些其他节点?@DYZ所有N个节点,无论是否有未包含在
    my_节点中的任何其他节点,感谢您的建议,都将尝试implement@Pythonic通常,如果图形没有定向,则它是一个简单的
    dfs
    task是的,图形是定向的。它是某种语法,是某些象征性词语的组合。如果随机输入这些单词,我需要重新组合它们伟大的答案,希望我能给它一个+10。现在有很多工作要做,谢谢!如果您有任何建议,请查看以下内容: