【问题标题】:How to find the longest path in a graph with a set of start and target points?如何在具有一组起点和目标点的图中找到最长的路径?
【发布时间】:2015-06-06 23:17:11
【问题描述】:

我有一个 DAG(每条边的成本/权重),并且想找到两组节点之间的最长路径。与图中的节点总数相比,这两组起始节点和目标节点是不相交的,并且规模较小。

我知道如何在 one 起始节点和目标节点之间有效地做到这一点。有了多个,我可以列出从每个起点到每个目标节点的所有路径并选择最长的路径——但这需要二次单路径搜索。有没有更好的办法?

【问题讨论】:

标签: graph computer-science path-finding directed-acyclic-graphs


【解决方案1】:

我假设您想要尽可能长的路径,该路径从第一组的任何节点开始,到第二组的任何节点结束。然后你可以添加两个虚拟节点

  • 第一个节点没有前任,其后继是第一个集合中的节点。

  • 第二个节点没有后继节点,其前继节点是第二组中的节点。

所有新添加的边都应具有零权重。

该图仍将是一个 DAG。现在,如果您使用标准算法在 DAG 中找到两个新节点之间的最长路径,您将获得从第一组开始到第二组结束的最长路径,除了会有一个额外的零-开头的加权边缘和结尾的额外零加权边缘。

顺便说一句,这个解决方案本质上是从第一组的所有节点执行算法,但与您的问题建议的顺序方法相反,是并行执行的。

【讨论】:

  • 我希望我没有太早接受答案,因为直觉上这很有意义并且非常容易!另一方面,我仍然想针对蛮力解决方案对其进行测试。但据我所知,这将完全有效!谢谢!
  • 如果我的解决方案很明显有效,那么唯一可能出错的就是性能。拓扑排序在图的大小(节点+边)上花费线性时间,因此添加的两个带有少量边的节点几乎没有区别。如果一个节点位于起点和终点节点的路径上,我的算法会对其进行一次处理,蛮力算法对它位于的每一对起点和终点节点进行一次处理。此外,我的解决方案只需要初始化和后处理一次,而蛮力算法需要为每一对获取实际的候选最长路径以避免极端的内存消耗。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-17
  • 1970-01-01
  • 2019-05-27
  • 1970-01-01
相关资源
最近更新 更多