一 问题背景
在现实生活中,很多问题都可以转化为图来解决问题。例如,计算地图中两点之间的最短距离、网络最小成本布线,以及工程进度控制,等等。这些问题都涉及最小路径的求解。
二 Dijkstra 算法
给定有向带权图 G=(V,E),其中每条边的权值都是非负实数。此外,给定 V 中的一个节点,称之为源点。求解从源点到其他各个节点的最短路径,路径长度指路上各边权之和。
可以使用 Dijkstra 算法对最短路径进行求解。Dijkstra 算法是解决单源最短路径的贪心算法,它先求出长度最短的一条路径,再参照该路径求出长度次短的一条路径,直到求出从源点到其他各个节点的最短路径。
Dijkstra 算法的基本思想:假定源点 u,节点集合 V 被划分为两部分:集合 S 和集合 V-S,初始时,在集合 S 中仅包含源点 u,S 中的节点到源点的最短路径已经确定。集合 V-S 所包含的节点到源点的最短路径待定,称从源点出发只经过集合 S 中的节点到达集合 V-S 中的节点的路径为特殊路径,并用数字 dist[] 记录当前每个节点所对应的最短特殊路径长度。
Dijkstra 算法采用贪心策略是选特殊路径长度最短的路径,将其连接的集合 V-S 中的节点加入集合 S,同时更新数字 dist[]。一旦集合 S 包含所有节点,dist[] 就是从源点到所有其他节点的最短路径长度。
三 算法步骤
1 数据结构
设置地图的邻接矩阵 G.Egge[][],即如果从源点 u 到节点 i 有边,就让 G.Egge[][], 等于<u,i>的权值,否则 G.Egge[][],=无穷大;采用一维数组dist[i] 记录从源点到节点 i 的最短路径长度;采用一维数组 p[i