- 图的应用实在很广,课堂所学实为皮毛
- 考虑基于邻接矩阵的无向带权图,边的权值的典型意义就是路途的长度,从顶点u到顶点v的边权值为w,可以表示城市u到城市v之间路长为w。
- 最短路径问题考虑的就是从某个顶点出发到其他任何一个顶点所经过的最短的路径。
Dijkstra迪杰斯特拉算法
- 根据起点V0,最终得到的是一个从V0到其他顶点的路径按路径长度依次递增的次序产生最短路径,可知一共有(顶点总数-1)条路径,分别对应着V0到其他某一顶点的最短路径。
- n为顶点总数。则有顶点集V[n],起点索引“iv0”,邻接矩阵G[n][n];引入辅助向量D[n],D[iv]表示当前从顶点”iv0”到”iv”的最短路径的长度;引入辅助向量Final[n],Final[iv]为true表示顶点“iv0”到“iv”的最短路径已经找到。
- 循环次数为n-1次,依次递增地得到一条最短路径。如此描述着实难以理解,不知一下说明是否有帮助
Dijkstra最终得到的最短路径集 | 长度 | 经过的边集 |
---|---|---|
iv0 -> v1 | L1 | E1 |
iv0 -> v2 | L2 (大于l1) | E2 |
… | … | … |
iv0 -> vn-1 | Ln-1 (最大) | En-1 |
原理
- 1)从“iv0”出发的最短路径集中最短的一条必然是可以从“iv0”出发只经过一条边(设为e)到达。假设存在一条经过m(m>1)条边的更短的路径,那么这条边上从“iv0”出发的第一条边(设为e0)必然比”e”要短,那么”e0”就是最短的只经过一条边的路径。也就是说表中的E1必然只有一条边。
- 2)首次循环将D[i]赋值为G[iv0][i],表示从“iv0”直接到达顶点“i”的路径的长度(无路径则为ManInt表示无穷)。Final除“iv0”为true外其余均为false。
- 3)则D[n]中((值最小)&&(Final为false))的顶点就是上表的“v1”,并将Final[v1]设为true表示从“iv0”到“v1”的最短路径已经找到了。
- 4)下一步寻找v2,也就是最短路径集中第二短的路径。我们已经找到了最短路径集中最短的路径也就是从“iv0”到“v1”这条路径,那么从“iv0”到“v2”的最短路径只能是以下两种情况之一
- 1、从“iv0”直接到达“v2”
- 2、从”iv0”经过“v1”到达“v2”
- 说明:假如存在(iv0)->(v’)->(v2)为最短路径集中第二短的路径,那么也就存在(iv0)->(v’)要比这条“第二短”的路径更短,但是比“第二短”的路径更短的路径只能是我们已经找到了的(iv0)->(v1),所以不存在所谓的(v’