双向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;//源点到可达顶点的距离