【问题标题】:How to find a set of paths that cover all edges from source to sink in a DAG?如何在 DAG 中找到一组覆盖从源到汇的所有边的路径?
【发布时间】:2020-01-23 08:46:02
【问题描述】:

我有一个有向无环图(由邻接矩阵给出)、一个源节点和一个汇节点。我想找到一组路径 P 的基数不超过边的数量,从源到接收器,这样对于图中的每个边 e,在 @ 中存在一个路径 p 987654325@ 这样的ep

我的想法是找到图中的所有路径,一旦我覆盖了所有边,我就会停下来。我认为这个想法不是最好的,可能还有更好的方法。

我从this code开始:

def all_paths(adjm, source, sink, path, edges):
    # def covered(E, P):
    #     e = []
    #     for p in P:
    #         e.extend([(p[i], p[i + 1]) for i in range(len(p) - 1)])
    #     if set(e) == set(E):
    #         return True
    #     else:
    #         return False

    path = path + [source]

    if source == sink:
        return [path]

    paths = []
    for child in range(source + 1, adjm.shape[0]):  # I assume that the nodes are ordered
        if adjm[source, child] == 1:
            if child not in path:
                # if not covered(edges, paths):
                paths.extend(all_paths(adjm, child, sink, path, edges))

    return paths

【问题讨论】:

  • 如何检查是否所有边缘都被覆盖?
  • 查看我的编辑。但是,该代码没有给出预期的结果。我仍在调试以找出覆盖的功能不起作用的原因。
  • 到底是什么问题,你的问题是什么?

标签: python algorithm graph-algorithm directed-acyclic-graphs


【解决方案1】:

“基数不超过边数的一组路径P”

好吧,如果允许每条边有一条路径,那么有一个非常简单的算法可以工作:

  • 使用 Dijkstra 算法预计算从 source 到所有其他节点的路径。
  • 使用 Dijkstra 算法预计算从所有其他节点到 sink 的路径,但假设每条边的方向都相反。
  • P 初始化为空集。
  • 对于图中的每条边u-v
    • 通过连接从sourceu 的预计算路径、然后是边缘u-v、然后是从vsink 的预计算路径来形成一条路径。
    • 将此路径添加到P
  • 返回P

结果集包含路径,使得每条边都包含在至少一个路径中,通过构造。

您还可以很容易地改进算法,方法是维护目前使用的一组边,当您添加到P 的路径时更新该组,如果u-v 已经在该组中,则跳过循环中的u-v

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-08
    • 2013-10-25
    • 1970-01-01
    相关资源
    最近更新 更多