再读dijkstra算法 以及运用
在《图论算法及程序设计》中,这个算法没有明显的提出,叫:最短路的标号法。
再一次发现,我对dijkstra的理解还是不够啊~
其关键在于贪心。。
每一次选出的特定点到其他点的最短路都是每一次的最优解,也就是说,求出来之后,最短路就不会再改变了,要这样想:
既然每一次都是得到的最优值,那么会使下一次得到的也是最优值。。。
不知道说清楚没有。。。
编程的代码思路就是:
找到已经得到的最优解的点,由这些点得到还没有最优解的点,如果两者之间有边,且best<v[i,j]+d[i]
那么把best的值更新;每次把n个点遍历完后,将best的值赋给最小的那个点,如果best的值与其初值相同,没有改变,说明该图中的特定点出发的最短路已经找完,可跳出循环
复杂度:
用矩阵的话为n^3
用邻接表为n^2*m
另外,最短路可扩展。。。
即:如果要求一个图的中心点时(中心点即其他各点到这个点的最短距离的最大值最小)
在计算特定点到各个点的最短距离时就可以求出到这个点的最短距离的最大值,在n个顶点的最短距离的最大值求取时,就可求最大值的最小值。。。
也就是说用dijkstra做这个,复杂度为:n^3*m;
据我分析,也可以用floyd做。。。 直接先求出每两个点之间的最短路,然后就可以对每个点求其最短距离的最大值,最后再求最大值中的最小值。。。
复杂度为:n^3
——读《图论的算法与程序设计》