Graph 在有特定代价的无向图中寻找路径

Graph 在有特定代价的无向图中寻找路径,graph,complexity-theory,dijkstra,depth-first-search,backtracking,Graph,Complexity Theory,Dijkstra,Depth First Search,Backtracking,假设我们有无向加权图。我们的任务是找到两个顶点(源和目标)之间总成本等于N的所有路径。 我认为可以用改进的Dijkstra算法结合BFS或DFS来实现,但我不知道如何实现这一点。感谢您的帮助。假设您有一个框架/库来创建图形数据结构并遍历它,如果您遇到资源约束,您可以执行回溯深度优先搜索并提前返回。在伪代码中: void DFS(Vertex current, Vertex goal, List<Vertex> path, int money_left) { // oops i

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

假设您有一个框架/库来创建图形数据结构并遍历它,如果您遇到资源约束,您可以执行回溯深度优先搜索并提前返回。在伪代码中:

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));      
}
void DFS(顶点当前、顶点目标、列表路径、整数左){
//哎呀
如果(剩余金额<0)
返回;
//避免循环
如果(包含(路径、当前)
返回;
//明白了!
如果(当前=目标)){
如果(剩余金额==0)
打印(路径);
返回;
}
//继续找
children=继任者(当前);//可选地从低成本到高成本排序
用于(儿童:儿童)
DFS(子项,添加路径(路径,子项),剩余资金-成本(子项));
}

然后您可以将其称为
DFS(开始、目标、列表(空)、N)

相等,或者最多相等?如果是前者,通过简化到哈密顿路径问题,问题是NP难的。那么你的问题是NP难的(NP完全或更糟),我似乎找不到NP解决方案来计算路径。注意,可能有多达
(n-2)解决方案(完整的图形,所有边长度相等,需要一个哈密顿路径),因此枚举将非常慢。我的目标不是计算路径,而是计算路径的总值,该值等于您要枚举长度为
N
的路径,对吗?可能有很多。你不应该只在钱=0时打印吗?看起来不错otherwise@Patashutnx,更新。如果没有该子句,它将找到所有带有
成本的路径,如果current==goal,但还剩下钱!=0,因此它不会进行无意义的搜索goal@Patashu很高兴看到在你的时区里你还没睡着;-)更新。