单源最短路径问题,即在图中求出给定顶点到其它任一顶点的最短路径。
本代码的测试数据如下,算法思想和说明在下面代码的注释部分:
/*
* 该代码采用优先队列式的分支限界法解决了单源最短路径问题。相比贪心算法中的德杰特斯拉算法复杂度
* 有所增加,但是作为搜索算法的经典问题,该算法完美展现了优先队列在分支限界法中的应用以及广度
* 优先搜索算法的特点。该问题同样是一棵多子树的子集树搜索问题,和前几篇博客大有不同,
* 这段代码采用的是广度优先搜索,不存在回溯的问题,每个节点只有一次成为扩展节点的机会,
* 一旦成为扩展节点,就遍历其所有的孩子,通过剪枝函数,将有可能达到最优解的孩子放入到优先队列中,
* 遍历结束后,这个节点变为死节点,从优先队列中继续取出下一个节点,进行操作,直到整个队列为空。
* 优先队列中的优先级根据不同的题目有不同设定,在本题中优先级设定为从源节点到该节点距离。距离
* 源节点越近,优先级就越高,这样就趋向于能够尽早发现最短路径,从而能够更好的实现剪枝操作。
*
* 剪枝函数:考虑某个节点的某个孩子是否应该加入队列时,我们从两个方面进行考量。
* 第一,判断某一个孩子是否是可达的,如果该节点本身和选中的孩子节点并不联通,则该节点变为死节点。
* 第二,判断经过这个节点到达其孩子节点后的总距离和该孩子节点中存储的最短距离比较,如果比那个距离
* 要长,则这条路径是没有意义的。不放入优先队列。
*
* */
package BranchAndBounding;
import java.util.PriorityQueue;
//定义节点,设置其比较性为距离源节点的距离lengt