【问题标题】:Finding first meeting point of paths in directed acyclic graph在有向无环图中找到路径的第一个交汇点
【发布时间】:2013-12-18 12:10:29
【问题描述】:

我目前有一个带有单个端点的有向无环图。顶点表示为具有一个或多个对它们可以指向的顶点的引用的对象。我有能力找到从任何给定起点到终点节点的所有节点路径,其中路径表示为节点对象列表。

现在,比如说我正在检查一个有多个出口的节点。我想找到来自当前节点的所有路径相遇的第一个节点。我可以让每条路径都到最后,然后遍历一条路径的节点,然后遍历其他路径,直到我找到这个节点,如果我没有'找不到它然后我去路径一的下一个节点。但是,这似乎非常低效,因为我可能不得不多次检查每条路径中的每个节点的长度为第一条路径的长度。下面是我的解决方案。有没有办法提高效率?

for each (exitNode){
    pathList.addAll(exitNode.getPathsToSink());
}
for each (node in pathList(0)){
    bool isMeetNode = true;
    int i = 1;
    while (i < pathList.size && isMeetNode){
        i++
        isMeetNode = pathList(i).contains(node)//checks each node in the path
    }
    if (isMeetNode){
        return node;
    }
}

【问题讨论】:

  • 我可以走到尽头——这是一个相当乐观的断言。可能会成倍增加。
  • 是的,数量可能成倍增加。但是,我已经开发了一种算法,可以生成这些成倍增长的路径。我现在想做的是减少处理这些路径的工作。
  • 如果你已经有所有N个路径,在每个顶点做一个计数器,遍历所有路径,递增对应的计数器。第一个获得 N 分数的顶点就是你要找的那个。

标签: performance language-agnostic graph-theory


【解决方案1】:

为子图的每条边分配一个流。使用有理数可能最容易。从作为流源的起始顶点开始 1. 在外边之间均匀划分。一路走到水槽。

现在流经它的每个顶点都位于所有路径上。你只需要找到离源最近的一个

【讨论】:

  • 啊,我明白了!我只是太专注于每条单独的路径,无法看到全貌。谢谢!
猜你喜欢
  • 2015-06-16
  • 1970-01-01
  • 2011-02-22
  • 2022-01-21
  • 1970-01-01
  • 1970-01-01
  • 2020-08-07
  • 2015-06-24
  • 2012-07-22
相关资源
最近更新 更多