数据结构–最短路径
什么是最短路径
最短路径就是 从A-B之间可以抵达的路径中的最短的一条或是多条。
最短路径的两种解决方案
Dijkstra算法 和 弗洛依德算法
思路
Dijkstra 算法 的主要思想就是根据路径路径长度递增序列进行的。
计算的是从一个点到所有点的最短路径(原因是计算从一个定点到每个点的路径的时候都会用到之前的最短路径,以此确定次短路径,也即在得到一个新的完成过滞后的最短路径的时候,要更新剩余的点的路径的长度,以此在下一步求得次最短的路径,这样,依次进行,就可以求得某点到所有的点的最短的路径。)
弗洛伊德算法求得是所有的任意量丢按之间的最短路径。是根据加入一个点看是否存在更短路径的方法急计算的。
细看迪杰斯特拉算法
当看过迪杰斯特拉算法的描述后,发现,:这小子是不是根据最小生成树而得来的灵感的呢? 原因是这两个算法的思想太像了,(有兴趣的话可以了解一下最小生成树的算法哦)。
迪杰斯特拉算法是这样的。
起初:初始化
初始化所有点到到定点的距离 D[ M] 数组,(即:如果存在弧,则当前的最短路径长度就是弧的权值。否则是极大值。在程序中允许出现我们自己设定的极大值),然后初始化在这条路径经过的点,即:path 数组,path[v][i] 表示从定点到点v的最短路径中经过点i
同时还要设置一些标志数组,表示点的所属集合。 例如:final 数组。
下面,就要进行关键的部分的了。
求得第一个最短路径中的最短的一条路径,并且将点并入S集合,置点为已经求得最短路径。
然后更新剩余的点到定点的最短路径(也即本状态下的次短路径),更新的时候,次短路径有两种可能,要么是借助已知的完成最短路径的最小值,加上由上一个点到这个点的距离,,要么就是这个点不经过S集合。只是定点到这个点的长度。所以应该比较得出当前的剩余的点中的最小的长度。
注: 即使是经过这个S集合,经过的也是有这个点的。
然后,我们比较得出当前的最短路径,然后并入, 再更新最短路径,,然后再比较得出最短路径,并入,更新, 再比较,并入,更新, [比较 并入 更新] [比较 并入 更新]……….. 就这么循环到所有点都求出来吧