如何在有向树图中找到度数 > 2 的顶点之间的路径?

问题描述

我没有接受过图论方面的培训,所以我的术语很差。我有一个有“冗余节点”的有向树图。我将“冗余节点”定义为树图中度数 = 2 的节点。我想找到一种有效的方法来返回所有非冗余节点之间的所有路径,最好使用 NetworkX (Python) 工具。这个非常简单的图形展示了我想要实现的目标:

enter image description here

因此,鉴于此图,我想返回三个路径(p1、p2 和 p3),它们表示 1->4、5->4 和 4->7 之间的连接。

我可以编写一个算法来“手动”执行此操作,从某种意义上说,我从度数=1 的节点开始,然后沿着图“走”,直到遇到另一个非度数=2 的节点。但是,我怀疑已经有一种形式化的方法可以进行这种分析,但我似乎无法弄清楚。

对于更多上下文,我的图更大更复杂,因为它们代表河流网络,如下所示:

enter image description here

但它们总是树,没有循环。

解决方法

不,恐怕您已经找到了进行迷你路径的最有效方法。您可以通过从汇合节点向后工作来稍微加快处理速度,但这就是您可以改进的全部内容。这样做可以让您更有效地删除中间节点,而不是简单地查找源节点(您仍然必须这样做)。然而,该算法并不那么简单。目前,我建议您坚持使用已有的简单设计。


  • 将所有节点放入一个集合 to_visit
  • to_visit 不为空:
    • node = to_visit.pop()
    • 如果节点的度数为 1:# 源节点:找到汇合路径
      • 跟踪路径,直到遇到度数 > 2 的节点。
      • to_visit 中删除所有中间节点。
      • 发射路径。
,
LOOP over all nodes
    calculate degree
    IF degree == 2
       add to vector deg2
LOOP over all nodes in deg2 to get src
    LOOP over all nodes in deg2 starting at src+1 to get dst
        find path from src to dst ( dijsktra algorithm )