Dijkstra算法

贪心的思想

需要的数据结构:

1. S和T(两个容器,比如vector类型,用于存放访问过的点(S)和没访问的点(T))

2. 一个数组pre[n],n是图的顶点个数,“pre[6]==7”表示在当前的最短路径中,顶点6的前一个顶点是7,起点的前置顶点是-1

3. 二维数组d[n][n],n是图的顶点个数,"d[0][6]=12"表示顶点0到顶点6的当前最短距离是12,如果两点间不可达,则d[0][6]=无穷

算法输入参数

图g,起点start(int),终点end(int)

算法过程:

1. 初始化各数据结构:1) S里只有start,2) T里有图g中除了start之外的所有顶点,3) pre[n]全部置为-1,4) d[n][n]全部置为无穷

2. 处理和start相邻的点

对于T中的任何点i,如果start和i之间有边,则1)d[start][i]=边(start,i)的权值,d[n][n]中其他的值还保留为无穷;2)pre[i]=start

3. 循环进行以下操作,直到T中的顶点被删完了:

1)从T中找出d[start][t]最小的那个t,将t加入到S中去,并从T中删除掉

2)对于t,对于T中和t相邻的所有顶点i,如果d[start][i]>d[start][t]+边(t,i)的权值,则(1)d[start][i]=d[start][t]+边(t,i)的权值 (注意“=”是赋值的意思),就是把start和i之间的距离换成更小的(如果有的话);(2)pre[i]=t

4. 当T中的顶点删完了的时候,3中的循环停止,这时,所有的顶点都被处理过了。因此从点end开始,根据pre[end]找到前一个顶点,依次往前寻找,直到找到start结束,就是start到end的最短路径

原文地址:https://www.cnblogs.com/james6176/p/4488436.html