问题描述
- 给定一个带权有向图 G = ( V , E ) G = (V , E) G=(V,E),其中每条边的权是非负实数,给定 V V V中的一个顶点,称为源
- 计算从源到所有其他各顶点的最短路径长度
Dijkstra
算法
Dijkstra
算法是解单源最短路径问题的一个贪心算法- 其基本思想是,设置顶点集合 S S S,并不断地做贪心选择来扩充这个集合,一个顶点属于集合 S S S当且仅当从源到该顶点的最短路径长度已知
- 初始时, S S S中仅含有源,设 u u u是 G G G的某一个顶点,把从源到 u u u且中间只经过 S S S中顶点的路称为从源到 u u u的特殊路径,并用数组 d i s t dist dist记录当前每个顶点所对应的最短特殊路径长度,用数组 p a r e n t [ i ] parent[i] parent[i]记录从源到顶点 i i i的最短路径上 i i i的前一个顶点
Dijkstra
算法每次从 V − S V - S V−S中取出具有最短特殊路长度的顶点 u u u,将 u u u添加到 S S S中,同时对列表 d i s t dist dist和 p a r e n t parent parent做必要的修改,当 d i s t [ u ] + g r a p h [ u ] [ i ] < d i s t [ i ] dist[u] + graph[u][i] < dist[i] dist[u]+graph[u][i]<dist[i]时,置 d i s t [ i ] = d i s t [ u ] + g r a p h [ u ] [ i ] dist[i] = dist[u] + graph[u][i] dist[i]=dist[u]+graph[u][i],置 p a r e n t [ i ] = u parent[i] = u parent[i]=u- 一旦 S S S包含了所有 V V V中顶点, d i s t dist dist就记录了从源到所有其他顶点之间的最短路径长度
Dijkstra
算法的正确性
贪心选择性质
Dijkstra
算法所做的贪心选择是从 V − S V - S V−S中选择具有最短特殊路径的顶点 u u u,从而确定从源到 u u u的最短路径长度 d i s t [ u ] dist[u] dist[u],从源到 u u u没有更短的其他路径- 事实上,如果存在一条从源到 u u u且长度比 d i s t [ u ] dist[u] dist[u]更短的路,设这条路初次走出 S S S之外到达的顶点为 x ∈ V − S x \in V - S x