双向Dijstra算法

    双向Dijstra算法:在无向带权图中,求从s到t最短路径。双向Dijstra算法的思想是:分别从s顶点和t顶点开始执行单向Dijstra算法,从s点开始执行的Dijstra算法定义为前向Dijstra搜索,从t点开始执行Dijstra算法定义为后向Dijstra搜索。算法结束的条件是:前向(后向)Dijstra搜索求得当前最短路径上的顶点为u,且在后向(前向)Dijstra搜索已经计算出到u的最短路径,此时s到t的最短路径可以表示为sp(s,u)+sp(t,u)。
    如图所示:求s到t的最短路径,我们分别从s和t执行Dijstra搜索,经过三次迭代后,前向(后向)Dijstra搜索已经求得最短路径上的点为s,a,b(t,g,f),此时优先队列Qf(执行前向Dijstra搜索使用的优先队列)和Qb(执行后向Dijstra搜索使用的优先队列)中分别存储c,d和e,d,且此时s到c和d的最短距离分别为6,10;t到e和d的最短距离也分别为6,10。继续执行,前向Dijstra搜索中c顶点执行出栈操作,同时松弛(c,e)和(c,d)边;后向Dijstra搜索中e顶点出栈,同时松弛(e,c)和(e,d)边。再一次迭代时,前向Dijstra搜索中e顶点执行出栈操作时,后向Dijstra搜索中已经求得t到e最短距离,所以双向Dijstra算法结束,最后求得s到t的最短距离为sp(s,e)+sp(t,e)=13。
//使用二叉堆选择最小元素的双向Dijstra算法
#include<iostream>
#include<vector>
#include<fstream>
#include<time.h>
using namespace std;

//优先队列里存储元素类型
struct Node
{
	int ver;//源点可达的顶点
	int dis;//源点到可达顶点的距离
  • 4
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值