贪心算法之单源最短路径问题

给定带权有向图G=(V,E),其中每条边的权都是非负数。给定一个起始顶点,成为源。计算从源到所有其他定点的最短路径长度。路径长度是各边权重之和。该问题称为单源最短路径问题。
基本思想:Dijkstra算法(迪杰斯特拉算法)是解单源最短路径问题的贪心算法
Dijkstra算法特点:以起始点为中心向外层层扩展,直到扩展到终点为止,是一种广度优先搜索方法。
Dijkstra算法原理:最优子路径存在(贪心算法的最优子结构性质)。假设S→F存在一条最短路径SF,且该路径经过点A,那么SA子路径一定是S→A的最短路径。
该算法的时间复杂度是o(n^2).

实例:
1、带权有向图,从0源起始,计算最短路径长度。
贪心算法之单源最短路径问题_第1张图片
加入S集合中顶点的顺序:{0,4,2,3,1}
步骤:
(1)先建立两个集合:用来存已经找到的最短路径的结点即S={};用来存未找到的最短路径的结点即U={}。SU互补,S U U=全集(所有结点),当U为空时,算法结束,找到最短路径。
(2)若源与点i直接相连,则dist[i]等于权重,若源与i不直接相连,则dist[i]=∞。
(3)建立数组dist[i],存源到i点的距离,选取最小的dist[i]存入到S中,将i从U中移除。随着找到的路径结点更新源i 到未找到点的距离dist[i]。若点i已经在S中之后将不再更新dist[i].
(4)重复(3)步骤,直到U为空时,结束算法。
上图中左图是带权有向图,其中路线上的值为点到点的权重,右表是Dijkstra算法的迭代过程,每次迭代选取红色圆圈的结点从U移到S,并根据S中已有结点更新源到i的距离dist[i].迭代终止的条件是U为空。

Dijkstra算法的重点:需要选取最小的dist[i]和根据找到的结点更新dist[i].

2、带权有向图,从0源起始,计算最短路径长度。
贪心算法之单源最短路径问题_第2张图片
加入S集合中顶点的顺序:{0,1,3,2,4}
3、带权有向图,从1源起始,计算最短路径长度。
贪心算法之单源最短路径问题_第3张图片
加入S集合中顶点的顺序:{1,2,4,3,5}

你可能感兴趣的:(algorithm)