Answers:
首先,我们如何使BFS适应更一般的加权图?
这是Dasgupta等人在《算法(第4.4节)》一书中提出的一个想法:
对于任何边缘的(与重量),通过替换它长度的边缘,加入虚拟节点之间和。
结果,结果图的边缘都具有单位长度。因此,我们可以通过在G '上运行BFS 来计算的距离。
其次,基于 Dijkstra算法如何在变换后的图形上击败BFS ?
如果很大,上的BFS 可能真的很慢,因为在计算到我们根本不在乎的虚拟节点的距离时会浪费太多时间。Dijkstra算法通过设置节点的估计距离并尽可能放松它们来避免这种情况。
第三,Dijkstra算法在未加权图上的表现如何?
它的行为与BFS完全相同。我们从两个主要方面进行阐述。
关于“放松”。
对于一般加权图上的Dijkstra算法,松弛为
for all edges (u,v) in E:
if dist(v) > dist(u) + w(u,v)
dist(v) = dist(u) + w(u,v)
对于非加权图上的BFS,我们知道和,因此松弛较为简单:
for all edges (u,v) in E:
if dist(v) = \infty
dist(v) = dist(u) + 1
在“优先队列”上。
当Dijkstra算法在未加权图上运行时,优先级队列在任何时候最多包含两个不同的(距离)值。因此,BFS的FIFO队列就足够了。