在Dijkstra的算法中,放松最多被称为 m次(其中m = #edges)。我试图弄清楚一些具体的图形示例,哪个放松确实执行了m次。我知道每次找到更便宜的指向节点的路径时都会发生松弛,但我无法真正“想象”这种情况。
答案 0 :(得分:1)
如评论中所述,树就是一个例子。循环的示例是n个顶点(其中n为奇数)的图形,其具有以下边缘:
(1,2)成本1
(2,3)成本1
(1,3)成本10
,
(3,4)成本1
(4,5)成本1
(3,5)成本10
...
(n - 2,n - 1)成本1
(n - 1,n)成本1
(n - 2,n)成本10
来自顶点1的Dijkstra算法将始终放松昂贵的1-> 3,3-> 5,5-> 7,7-> 9,...(n-2) - > n边缘首先,然后会找到更长但更便宜的路径。
给定的图表是Dijkstra算法中为什么需要优先级队列的一个很好的例子。在随机图上,使用一个简单的队列并在每次边缘松弛之后将顶点向后推,往往工作得非常快,但这种算法在这种情况下会以指数时间运行。