首页 > 代码库 > 贪心算法应用-单元最短路径
贪心算法应用-单元最短路径
最短路径问题是用图中的顶点代表不同的城市,用图中顶点之间的连线即边上权值表示不同城市之间路径的长度,在从一个顶点到另一个顶点之间的所有路径中,求权值之和最小的路径的问题即为最短路径问题。
单元最短路径问题可以描述为在一个带有权值的有向图中,从一个顶点到另一个顶点存在多条通路。要求找一条从初始顶点S(源点)到达目标顶点D(终点)的最短路径,其中规定每条边的权值是一个非负实数。
Dijkstra基本思想:
对于单元最短路径问题,最好的方法是Dijkstra于1959年提出来的Dijkstra算法(双标号法),该算法的基本思想是设S为最短距离已确定的顶点集S,V-S是最短距离尚未确定的顶点集U。开始只有源点s的最短距离是已知的即SD(s)=0,故顶点集S={s}。按路径长度递增次序产生各顶点最短路径。
在当前集合U中选择一个最短距离最小的蓝点来扩充集合S,以保证算法按路径长度递增的次序产生各顶点的最短路径。
当集合U中仅剩下最短距离为无穷大的结点,或者所有未确定结点已扩充到已确定集S时,s到所有顶点的最短路径就求出来了。
注意:
如果从源点到未确定的路径不存在,则可假设该结点的最短路径是一条长度为无穷大的虚拟路径。
从源点s到终点v的最短路径简称为v的最短路径;s到v的最短路径长度简称为v的最短距离,并记为SD(v)。
结论:当按照长度顺序产生最短路径时,下一条最短路径总是由一条已经产生的最短路径加上一条边形成的。换而言之,下一条最短路径总是由已产生的最短路径再扩充一条最短的边得到,即Dijkstra算法采用贪心法的思想,它通过分步方法求出最短路径。首先产生一个到达新的目的顶点的最短路径,然后再所能达到的目的顶点通过如下贪心选择准则选取顶点,即在还未产生最短路径的顶点中,选择路径长度最短的顶点并入集合S。
Dijkstra算法:http://blog.csdn.net/wangdd_199326/article/details/62914026
贪心算法应用-单元最短路径