在Dijkstra算法中,面对单源单目标的最短路径,如果遇到了要relax的节点u就是目标节点t,显然就可以执行结束了。
Dijkstra算法的探索路径是从源一直往目标前景,那么加速它的一个角度就是从源开始探索的时候,同时从目标点向源开始探索,这种算法即Bi-Directional Search。
Bi-Directional Search
具体操作位,从源点和从目标两个方向均开始搜索,轮流的执行。两个方向的搜索意味着,在初始化的时候将有两个路径值::向前搜索最短路径、
向后搜索最短路径;两个最小优先级队列
、
;对应的前一个节点指向
、
;以及
、
- 向前搜索:沿着源点向目标搜索
- 向后搜索:沿着目标向源点搜索
Bi-Directional Search的结束条件是什么?
对于选出的顶点u,当他'同时'被前向搜索和后向搜索处理完成,或者说是‘同时’从、
中删除了,此时可以结束。
当 Bi-Directional Search的结束的时候,如何找到最短路径?
可能想到的思路是,如果u是第一个满足结束条件的,那么沿着各自的前向指针,即可找到最短路径。以如下搜索为例:
向前搜索
:从源点出发,使用Dijkstra算法,可以计算出
![Q_f](https://i-blog.csdnimg.cn/blog_migrate/0d0ef751b86553f8abcb4323290ab990.png)
![\infty](https://i-blog.csdnimg.cn/blog_migrate/cec8d2f3db24c17a318aded0e309333c.png)
![\infty](https://i-blog.csdnimg.cn/blog_migrate/cec8d2f3db24c17a318aded0e309333c.png)
![S_f](https://i-blog.csdnimg.cn/blog_migrate/7d5e93103ecfa47fa4147287d859f6ec.png)
向后搜索
:从目标出发,使用Dijkstra算法,可以计算出
![Q_b](https://i-blog.csdnimg.cn/blog_migrate/4c76d3db8432c7d68ab407a6905b96c8.png)
![\infty](https://i-blog.csdnimg.cn/blog_migrate/cec8d2f3db24c17a318aded0e309333c.png)
![\infty](https://i-blog.csdnimg.cn/blog_migrate/cec8d2f3db24c17a318aded0e309333c.png)
![S_b](https://i-blog.csdnimg.cn/blog_migrate/601c9eba5528ba24721912fa400bcc3c.png)
向前搜索
:从中移除的最小值为
=3,执行边(a,b)的Relax操作,可得到
={u(5),b(6),t(
)},
={s(0),a(3)}
向后搜索
:从
![Q_b](https://i-blog.csdnimg.cn/blog_migrate/4c76d3db8432c7d68ab407a6905b96c8.png)
![d_b[b]](https://i-blog.csdnimg.cn/blog_migrate/d4a9fc691df2818caff15796f5d32493.png)
![Q_b](https://i-blog.csdnimg.cn/blog_migrate/4c76d3db8432c7d68ab407a6905b96c8.png)
![\infty](https://i-blog.csdnimg.cn/blog_migrate/cec8d2f3db24c17a318aded0e309333c.png)
![S_b](https://i-blog.csdnimg.cn/blog_migrate/601c9eba5528ba24721912fa400bcc3c.png)
向前搜索
:从中移除的最小值为
=5,执行边(u,t)的Relax操作,可得到
={b(6),t(10)},
={s(0),a(3),u(5)}
向后搜索
:从
![Q_b](https://i-blog.csdnimg.cn/blog_migrate/4c76d3db8432c7d68ab407a6905b96c8.png)
![d_b[u]](https://i-blog.csdnimg.cn/blog_migrate/b0877c730e1ac27476a4d9b4026b0c26.png)
![Q_b](https://i-blog.csdnimg.cn/blog_migrate/4c76d3db8432c7d68ab407a6905b96c8.png)
![S_b](https://i-blog.csdnimg.cn/blog_migrate/601c9eba5528ba24721912fa400bcc3c.png)
![Q_f](https://i-blog.csdnimg.cn/blog_migrate/0d0ef751b86553f8abcb4323290ab990.png)
![Q_b](https://i-blog.csdnimg.cn/blog_migrate/4c76d3db8432c7d68ab407a6905b96c8.png)
正确的计算方式为:当终止之后,应该找到一个顶点x,使得
![d_f[x]](https://i-blog.csdnimg.cn/blog_migrate/60e8ab6b41071bfeaece31170222461b.png)
![d_b[x]](https://i-blog.csdnimg.cn/blog_migrate/5d2fa364ae66f6116ebb2a2db0983697.png)
![S_f](https://i-blog.csdnimg.cn/blog_migrate/7d5e93103ecfa47fa4147287d859f6ec.png)
![Q_f](https://i-blog.csdnimg.cn/blog_migrate/0d0ef751b86553f8abcb4323290ab990.png)
![S_b](https://i-blog.csdnimg.cn/blog_migrate/601c9eba5528ba24721912fa400bcc3c.png)
![Q_b](https://i-blog.csdnimg.cn/blog_migrate/4c76d3db8432c7d68ab407a6905b96c8.png)
![d_f[x]](https://i-blog.csdnimg.cn/blog_migrate/60e8ab6b41071bfeaece31170222461b.png)
![d_b[x]](https://i-blog.csdnimg.cn/blog_migrate/5d2fa364ae66f6116ebb2a2db0983697.png)
另一种算法为Goal-Directed Search ,详见 www.researchgate.net/publication…
附录
算法导论(MIT 6.006 第18讲)