Algorithm Dijkstra算法性质 迪克斯特拉(G,w,s){ 国际空间站(G,s); 让我们成为一个空集 设Q为优先级队列,用V[G]初始化 Q不是空的: uu->v和(s,v)不在E中,那么(s,u)会在(u,v)之前放松, 那么为什么每次选择最小d[v]都很重要呢
假设存在一个函数extractMaxFiniteD(Q),它返回顶点v,这样它的最大d[v]在Q中是有限的 假设我们将该行更改为u示例: 节点:a、b、cAlgorithm Dijkstra算法性质 迪克斯特拉(G,w,s){ 国际空间站(G,s); 让我们成为一个空集 设Q为优先级队列,用V[G]初始化 Q不是空的: uu->v和(s,v)不在E中,那么(s,u)会在(u,v)之前放松, 那么为什么每次选择最小d[v]都很重要呢,algorithm,computer-science,graph-theory,dijkstra,Algorithm,Computer Science,Graph Theory,Dijkstra,假设存在一个函数extractMaxFiniteD(Q),它返回顶点v,这样它的最大d[v]在Q中是有限的 假设我们将该行更改为u示例: 节点:a、b、c 边缘(和重量):(a、b、1)(a、c、10)(b、c、1) 在这个问题上试试你的算法,你会发现c的最小代价路径是10,而它显然是2 当你从Q中删除一个节点时,你不会再放松它,如果你删除一个具有最大成本的节点,那么你不会考虑更少的扩展方法来达到那个节点。 如果你不想从Q中选择最小节点,那么你也不能将其从Q中移除,你必须将其保留在集合中,以便在
边缘(和重量):(a、b、1)(a、c、10)(b、c、1) 在这个问题上试试你的算法,你会发现c的最小代价路径是10,而它显然是2
当你从Q中删除一个节点时,你不会再放松它,如果你删除一个具有最大成本的节点,那么你不会考虑更少的扩展方法来达到那个节点。
如果你不想从Q中选择最小节点,那么你也不能将其从Q中移除,你必须将其保留在集合中,以便在未来的迭代中放松。这就是该算法的基本功能。Dijkstra算法的主要思想是:当你从
Q
中取出一个顶点时,该顶点是好的。你不必重新定义在未来把它砍掉
如果您从Q
中获取一个随机元素,则此条件不成立-一旦您从Q
中获取一个顶点v
,则不能保证d[v]
确实是到v
的最短路径
如果你采用最小值-这是有保证的,因为如果
v
在Q
中是最小值,那么对于Q
中的每个u
,d[u]>=d[v]
,因此无论你下一步做什么样的放松,你都无法提高d[v]
你真的在任何图形上尝试过吗?使用Max会产生错误结果的概率非常高!我对特定的图形不太感兴趣,我想通过选择最小每一步来了解我们试图保留什么属性。如果你在几乎任何图形上都这样做,一步一步地进行,并看到中间结果,你会明白选择无穷大的目的是不合法的,让我们假设extractMaxFiniteD返回顶点v,这样它的最大d[v]在Q中是有限的,它仍然那么平凡吗?
Dijkstra(G,w,s) {
ISS(G,s);
let S be an empty set
let Q be a priority queue, initialized with V[G]
while Q is not Empty:
u<-extractMin(Q);
add u to S
for each vertex v neighbor of u
Relax(u,v,w);
}