Graph 在有特定代价的无向图中寻找路径
假设我们有无向加权图。我们的任务是找到两个顶点(源和目标)之间总成本等于N的所有路径。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
我认为可以用改进的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很高兴看到在你的时区里你还没睡着;-)更新。