Java语言描述:分支限界法之单源最短路径问题(全网独家)

单源最短路径问题,即在图中求出给定顶点到其它任一顶点的最短路径。

本代码的测试数据如下,算法思想和说明在下面代码的注释部分:


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

import java.util.PriorityQueue;

//定义节点,设置其比较性为距离源节点的距离lengt
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值