最短路径之dijistra

dijistra算法:跑过一边之后就把源点到所有点的最短距离都求出来了

算法思想其实应该属于DP,因为这个问题有着明显的最优子结构

d[y]是指源点到y的最短距离,那显而易见:d[y] = min{d[x]+w(x,y)}

这个和一般的dp题代码有点区别,因为一般的都是根据下标来推下一个,而这个点之间的连接要靠图来判断

最重要的区别是初始化的时候只有一个值是已知的,就是所有源点直接相邻的点中d[]最小的那个点,其它的都是不确定的

所以这个递推式真正的写法应该式d[y] = min{d[y],d[x]+w(x,y)}因为每次比较只能得到一个真正的结果

 

如果让我描述一下核心思想,差不多就是:一个最短路中经过的任意两点间的路也一定是最短路,所以当求出一个点的最短路的时候就可以用它去更新其它的点了。

所以每轮选择的dis[i]最小值一定是正确的,因为若不是选这条路,是任意的其它路在加一段,任意的其他路都一定比dis[i]大了,别说再加一段了。

不能用dijistra做最长路问题

因为dijistra求最短路的主要步骤是在所有没有加入集合的点的dis[]数组中每次选最小的,就一定是最小的,这就是关键所在了,若是求最长路,每次选最大的是未必正确的

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章