问题描述
- 给定一个带权有向图 G = ( V , E ) G = (V , E) G=(V,E),其中每条边的权是非负实数,给定 V V V中的一个顶点,称为源
- 计算从源到所有其他各顶点的最短路径长度
分支限界算法
- 先用单源最短路径问题的一个具体实例来说明算法的基本思想
- 在下图所给的有向图中,每条边都有一个非负边权,求从源顶点 S S S到目标顶点 T T T之间的最短路径
-
解单源最短路径问题的优先队列式分支限界法用一极小堆来存储活结点表,其优先级是结点所对应的当前路长
-
算法从图 G G G的源顶点 S S S和空优先队列开始,结点 S S S被扩展后,它的 3 3 3个儿子节点被依次插入堆中
-
此后,算法从堆中取出具有最小当前路长的结点作为当前扩展结点,并依次检查与当前扩展结点相邻的所有顶点,如果从当前扩展结点 i i i到顶点 j j j有边可达,且从源出发,途径顶点 i i i再到顶点 j j j的相应的路径的长度小于当前最优路径长度,则将该顶点作为活结点插入到活结点优先队列中
-
结点的扩展过程一直持续到活结点优先队列为空时为止
-
下图是用优先队列式分支限界法解上图的单源最短路径问题所产生的搜索树,其中每个结点旁边的数字表示该结点所对应的当前路长
-
由于图中各边的权均非负,所以结点所对应的当前路长也是解空间树种以该结点为根的子树中所有结点对应的路长的一个下界
-
在算法扩展结点的过程中,一旦发现一个结点的下界不小于当前找到的最短路长,则算法剪去以该结点为根的子树
-
在算法中,利用结点间的控制关系进行剪枝
- 在上图中,从源顶点 S S S出发,经过边 a a a、 e e e、 q q q(路长为 5 5 5)和经过边 c c c、 h h h(路长为 6 6 6)的 2 2 2条路径到达图 G G G的同一顶点
- 在该问题的解空间树中,这 2 2 2条路径相应于解空间树的 2 2 2个不同的结点 A A A和 B B B
- 由于结点 A A A所相应的路长小于结点 B B B所相应的路长,因此以结点 A A A为根的子树中所包含的从 S S S到 T T T的路长小于以结点 B B B为根的子树中所包含的从 S S S到 T T T的路长
- 因而可以将以结点 B B B为根的子树剪去,这时称结点 A A A控制了结点 B B B
- 显然,算法可将被控制结点所相应的子树剪去