在具有特定成本的无向图中查找路径

Posted

技术标签:

【中文标题】在具有特定成本的无向图中查找路径【英文标题】:Finding paths in undirected graph with specific cost 【发布时间】:2013-01-24 12:32:07 【问题描述】:

假设我们有无向的加权图。我们的任务是找到两个顶点(源和目标)之间的所有路径,总成本等于 = N。 我认为可以通过修改后的 Dijkstra 算法结合 BFS 或 DFS 来完成,但我不知道如何实现这样的事情。感谢您的帮助。

【问题讨论】:

相等,或最多相等?如果是前者,则通过简化为哈密顿路径问题,该问题是 NP-hard。 那么你的问题是 NP-hard(NP-complete 甚至更糟),我似乎无法找到一个 NP 解决方案来count 路径。 请注意,最多可以有(n-2)! 解决方案(完整图,所有边的长度相等,需要哈密顿路径),因此枚举会非常慢。 我的目标不是计算路径,而是计算等于 N 的总路径值 你想枚举长度为N的路径,对吧?可能有很多个。 【参考方案1】:

假设您有一个框架/库来创建图形数据结构并对其进行遍历,如果您越过资源限制,您可以进行回溯深度优先搜索并提前返回。在伪代码中:

void DFS(Vertex current, Vertex goal, List<Vertex> path, int money_left) 
  // oops
  if (money_left < 0) 
     return;

  // avoid cycles
  if (contains(path, current)
     return;

  // got it!
  if (current == goal)) 
     if (money_left == 0)
         print(path);
     return;
  

  // keep looking
  children = successors(current); // optionally sorted from low to high cost
  for(child: children)          
      DFS(child, add_path(path, child), money_left - cost(child));      

然后您可以将其称为DFS(start, goal, List&lt;Vertex&gt;(empty), N)

【讨论】:

你不应该只在money_left == 0时打印吗?否则看起来不错 @Patashu tnx,已更新。如果没有该子句,它将找到带有 cost &lt;= N 的所有路径 如果 current == 目标但 money_left != 0 它仍应返回,因此它不会在目标之后进行毫无意义的搜索 @Patashu 很高兴看到在你所在的时区你还没有睡着 ;-) 更新了。

以上是关于在具有特定成本的无向图中查找路径的主要内容,如果未能解决你的问题,请参考以下文章

使用 Boost 的图 breadth_first_search() 在未加权、无向图中查找路径

是否有一种算法可以在无向图中找到成本最高的长度为 k 的路径

小橙书阅读指南——无向图深度优先搜索和路径查找算法

10 无向图的边

在无向图中查找所有大小为 N 的子树

python 使用networkx绘制带权无向图和带权有向图,以及标注特定路径