Dijkstra 算法的目的就是计算在有向带权的完全联通图下从A点到B点所需要的最短路径,权重是路径的长度或者可以说是开销。也就是说,长度越短开销越少的路径的选择几率就越大。网上很多的文章引用了红蓝点来标记,不过上次看到wikipedia上的一副图后觉得,算法这个东西虽然写的越数学越显得有能耐,但既然写出来就是让人看的,为何不写的简明易懂。可能我以后学完Knuth的那本书后,就做一本民众都看得动的算法书好了。算法没那么难。
言归正传。
假设从A点到B点有以下路径关系:
从A出发,可以选择去C、D、E,距离分别是20、3、15。
从C点可以直接到B,也可以选择到F,距离分别是2、5。
从E点也到F,距离是20。
从D点可以到C、E点,距离分别是10,15。
从F点最后会到B,距离是20。
A ------20----------→ C --------------2------------------- → B
↑ ↘--------5--------↘
↘ ------3----------→ D F ---20------ ↑
↓
↘ ------15----------→ E -------20----------↑
线里面的数字就是权,也就是距离,比如 A->C 的距离是20,C->B的距离是1。显然从A->D->C->B是最优路径:3+10+2=15.
好那么,Djikstra 要怎么做呢?
步骤1:
我们从A点开始,比较A点到C、D、E三点的最短路径,同时,在C、D、E三点分别记录A点到这三个点的距离。
这样我们就会首先选择D点,并在C、D、E上分别标出:20、3、15。
步骤2:
我们从选择的D点开始,D点可以到C、E,距离分别是10、15,D点本身是3,于是标记C、E两点分别为:3+10=13、3+15=18.
这时,C点原先是20,现在是13,所以C点变为13.
E点原先是15,现在是18,保留15不变。
13<15,所以选择C点为下一个点。
步骤3:
C点可以去B、F点,距离分别是2和5.显然C点会选择B点。
B被标记为13+2=15
F被标记为13+5=18
因为到B点就结束了。所以算法就完成了。
毕竟这个只是sn个人理解而已,很有可能理解错了-_-!! 如果理解如果有错误,请指出,大家一起学习嘛。
以上!