上周在使用邻接表或者邻接矩阵存储图两种算法中还是选择了使用邻接表存储图这种算法,可以在此基础上再使用Disjkstra算法计算最短路径可就难为到我了。几经调试自己写的代码,都还是找不到正确的路径,故我还是讲Disjktra算法的思想给重新顺一遍,终于明白了最短路径算法的思想,现在把我理解的算法思想以通俗易懂的话简要的说明一下。
Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到其他所有节点的最短路径。主要特地啊是以起始点为中心向外层扩展,直到扩展到终点为止。Dijsktra算法能得出最短路径的最优解,但由于它遍历计算的节点较多,所以效率低。
其基本思想是,设置顶点集合S并不断做贪心选择来扩充这个集合。一个顶点属于集合S当且仅当从源到该顶点的最短路径长度已知。
初始时,S中仅含有源。设u是G的某一个顶点,把从源到u且中间只经过S中顶点的路称为从源到u的特殊路径,并用路径dist记录当前每个顶点所对应的最短特殊路径长度。Dijsktra算法每次冲V-S中取出具有最短特殊路径长度的顶点u,将u添加到S中,同时对数组dist做必要的修改。一旦S包含了所有V中顶点,dist就记录了从源到其他顶点之间的最短路径长度。
例如,对下图中的有向图,应用Dijsktra算法计算从源节点1到其他顶点间最短路径的过程列在下表中。
Dijsktra算法的迭代过程: