【问题标题】:How to find the paths between vertices with degree > 2 in a directed tree graph?如何在有向树图中找到度数> 2的顶点之间的路径?
【发布时间】:2021-05-28 23:16:07
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: python graph tree networkx vertices


    【解决方案1】:

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


    • 将所有节点放入一个集合to_visit
    • to_visit 不为空:
      • node = to_visit.pop()
      • 如果节点的度数为 1:# 源节点:找到汇合的路径
        • 跟踪路径,直到找到度数 > 2 的节点。
        • to_visit中删除所有中间节点。
        • 发射路径。

    【讨论】:

    • 嗯,我认为这是一个基本且常见的问题,可以预先构建解决方案。感谢您的意见,我无意冒犯,但您如何确定没有更有效的方法?
    • 为了确定,我浏览了networkx 文档。尽管这是一个简单的问题,但它并不是特别常见。任何需要这种图的人通常都会在构建图之前或之后立即(如您所愿)对数据进行预处理以删除那些冗余节点。大多数更通用的树应用程序在数据设计上根本没有冗余节点。
    • 很公平,回到我认为的绘图板!
    【解决方案2】:
    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 )
    

    【讨论】:

    • 谢谢,我已经把一些东西放在一起,通过从树的“根”走向叶子,在汇合处停止(即度数!=2)并保存每个节点的节点来避免 for 循环抵达。我已经考虑过您提出的方法,但我相当有信心这对我的情况不是最佳的。 (我没有分享我的问题中的所有信息。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多