我正在寻找解决以下问题,与最短路径有关的问题。给定一个有向图G =(V,E),源s,目标t 1,t 2,...,tk,并且行进边{i,j}的成本为cij。现在我想知道从s到t1,...,tk的最短路径。但是,如果使用vertext v i(不是源或目标),那么我们有额外的成本C.请注意,两条路径使用相同的vertext vi,成本C只支付一次。最短路径变化
最短路径变化
回答
标准为O(n^3)动态规划解决方案...
http://en.wikipedia.org/wiki/Dijkstras_algorithm
...仍然有效,只有一个小的调整:
才算直接邻接矩阵成本,然后通过考虑快捷方式进行迭代,但是在计算vi上的快捷方式添加成本时。
创建修改weightning功能:
w'(u,v) = w(u,v) + C if v == c
w'(u,v) = w(u,v) otherwise
不难看出,
如果您正在寻找最短路径,每条路径是,如果用c然后penaltised当运行dijkstra's algorithm或Bellman Ford时,使用w'
任何使用c
的路径都会受到C
的惩罚,因为如果c
出现在路径中 - 它看起来只有一次,因此C
被添加到总重量中[注意c
在最短路径中不能出现多次],当然如果c
未在此路径中使用,则不会有任何处罚。
编辑:我不知道我的理解正确,如果有什么@SaeedAmiri被提的是正确的,并且如果你想给的惩罚只有一次[和路径总和最小化到T1, ...,TK]那么你应该使用不同的解决方案 - 用类似的想法:
创建weightning函数w”,使之:
w'(u,v) = w(u,v) + C + epsilon if v == c
w'(u,v) = w(u,v) otherwise
注意,重要的是小量是一个小尺寸,只能在w'上实现,并且尺寸最小。与w
图表
- 运行Dijkstra算法或BF,让我们表示权重,如结合
w'
图表W1
- 运行Dijkstra算法或BF让我们表示权重
W2
- 如果
W1[ti] == W2[ti]
每个TI ∈ {t1,...,tk} - 那么最短路径中不需要c
,总结果是SUM(W1[ti])
- 否则 - 结果为min {SUM(W1 [ti])+ C,SUM(W2 [ti])`
落后第4步的想法是你有两种可能性:
- 你可以得到所有的T1,...,TK不使用c,它会更便宜,然后使用具有路径它,所以你返回W2的总和。
- 或者,如果忽略
c
- 只会更加宽广 - 因此您可以自由使用它[并返回W1的总和],并仅添加一次惩罚。
但是,OP提到的C将会被计算一次。但是Vi可以有多种路径。 – 2012-04-17 10:42:20
@SaeedAmiri:我对这个问题的理解有点不同,我编辑了答案来引用这个问题,因为这可能确实是OP的内容。 – amit 2012-04-17 11:32:42
你还没有告诉我们到底是什么问题,但有一个明确的片段,承认了一个保守的客观保留减少。
对于集合封面的任意实例,为每个集合设置一个包含源,顶点和每个元素顶点的图。终端t1,...,tk是元素顶点。每个集合顶点的权重为0的边和与其元素对应的顶点的权重为零。在这张图上,我们必须购买一套封面以便从源头到达终端,并且每套封面都足够了。
除非有你可以告诉我们的关于你的实例的东西,多项式时间算法的近似比率不会比Theta(log n)好,所以我建议整数编程。
- 1. 最短路径上的变化(复数?)
- 2. 最短路径
- 3. 最短路径
- 4. 图最短路径?
- 5. DAG最短路径
- 6. 最短路径C#
- 7. 图上用权重变化的最短路径
- 8. 找不到最短路径
- 9. 最短路径Dijkstra Java
- 10. 旅行的最短路径
- 11. 最短成本路径
- 12. Prolog:Knight的最短路径
- 13. Neo4j 2.2.5 - Dijkstra最短路径
- 14. Dijkstra的最短路径,HackerRank
- 15. JavaScript中的最短路径
- 16. R,确定最短路径
- 17. 油箱的最短路径
- 18. K最短路径在R:igraph
- 19. 最短路径tsp算法
- 20. Dag的最短路径
- 21. 最短路径查找器
- 22. JGraphT图最短路径
- 23. 最短路径程序
- 24. 最短路径练习
- 25. OrientDB获取最短路径()
- 26. OrientDB:在最短路径
- 27. 寻找最短路径
- 28. Python,圆形最短路径
- 29. 寻找最短路径
- 30. 最短路径/伪代码
你喜欢最小化最短路径的总和吗? – 2012-04-17 10:48:40