图的应用——最短路径
最短路径
典型用途:交通问题。如:城市 A 到城市 B 有多条线路,但每条线路的交通费(或所需时间)不同,那么,如何选择一条线路,使总费用(或总时间)最少?
问题抽象:在带权有向图中 A 点(源点)到达 B 点(终点)的多条路径中,寻找一条各边权值之和最小的路径,即最短路径。
最短路径与最小生成树不同,路径上不一定包含 n 个顶点
两种常见最短路径问题
Dijkstra(迪杰斯特拉)算法 —— 单源最短路径
算法思想
把图中顶点集合分成两组:第一组为已求出其最短路径的顶点集合 S 第二组为尚未确定最短路径的顶点集合 U
初始时,S 只包含源点,S={v},U 包含除 v 外的其他顶点;
从 U 中选取一个距离最小的顶点 k,把 k 加入到 S 中;
以 k 作为新考虑的中间点,修改 U 中各顶点的距离;
重复步骤 2、3 直到所有顶点都包含在 S 中
算法实现
算法流程图
C++代码实现
复制代码
Floyd(弗洛伊德)算法 —— 所有顶点间的最短路径
每一对顶点之间的最短路径方法一:每次以一个顶点为源点,重复执行 Dijkstra 算法 n 次—— T(n)=O(n³)方法二:弗洛伊德(Floyd)算法算法思想:逐个顶点试探法
算法思想
初始时设置一个 n 阶方阵,令其对角线元素为 0,若存在弧<Vi,Vj>,则对应元素为权值;否则为∞
逐步试着在原直接路径中增加中间顶点,若加入中间点后路径变短,则修改之;否则,维持原值。
所有顶点试探完毕,算法结结束
算法实现
复制代码
版权声明: 本文为 InfoQ 作者【若尘】的原创文章。
原文链接:【http://xie.infoq.cn/article/309354431ac41ea0238cb561d】。文章转载请联系作者。
评论 (3 条评论)