最近有个同事问我迪杰斯特拉算法,以前都是直接用,三个循环体直接一套就出来,具体逻辑懒得去理解,这次被问到,就花了点时间理了理算法的底层逻辑。
---------
迪杰斯特拉算法是搜索出所有点到起点的最短距离。
怎么找?
第一步,找出距离V0最近距离的点,设为V2。(显然此时V2的最短路径已经找到,就是V2直达路径。)
第二步,以V2为中转点mid_Node,用m替代
(Lx0,表示Vx到V0的距离,Lxm表示Vx到mid_Node的距离,其他同理)
第三步,取其他任意点Vx,比较Lx0和Lxm+Lm0的大小,令cost[X]=min(Lx0,LXm+Lm0),即找到了点x到0的更短路径,并更新进cost数组里。(其实就是让其他点尝试以mid_Node为中转,能否缩短路径,若能,就更新最短路径。)在for循环里把所有的点都尝试一遍中转方案,并把最短路径更新。(对应代码里 for NEXT_Node in range(lenth):循环体的内容)
第四步,搜索cost数组里的最短路径(除被选为mid_Node的点外,点是否选过为mid_Node是用数组v[]做标记