1.Bellman-Ford算法:
Bellman-Ford算法基于一个直观上很容易理解的原理:如果节点A的每个相邻节点知道节点Z的最短路径,那么节点A计算经过它的每个相邻节点到节点Z的距离,就能够确定到节点Z的最短路径。
如图,应用Bellman-Ford算法来计算每个节点到节点6的最短路径,以及此最短路径的下一个节点。每个节点维护着一个表项(n,Di),其中n是此最短路径经过的下一个节点,Di是到目的节点的距离。算法执行过程如下:
迭代 | 节点1 | 节点2 | 节点3 | 节点4 | 节点5 |
初始 | (-1,∞) | (-1,∞) | (-1,∞) | (-1,∞) | (-1,∞) |
1 | (-1,∞) | (-1,∞) | (6,1) | (-1,∞) | (6,2) |
2 | (3,3) | (5,6) | (6,1) | (3,3) | (6,2) |
3 | (3,3) | (4,4) | (6,1) | (3,3) | (6,2) |
4 | (3,3) | (4,4) | (6,1) | (3,3) | (6,2) |
2)第1次迭代,节点6的相邻节点3和5发现其相邻节点到目的节点6的最短路径,故更新节点3和节点5的表项,其余仍为(-1,∞)。
3)第2次迭代,节点1发现其相邻节点3到目的节点的距离为3,故更新其自身表项为(3,3),注意节点4发现其两个相邻节点都有到目的节点的最短路径信息,经过比较选择经过节点3的路径。其余节点同理检查更新。
4)第3次迭代,节点2发现经过节点4到目的节点的路径更短,故更新其表项,其余节点同理。
5)第4次迭代,没有节点更新,算法结束。
因此我们将Bellman-Ford算法总结如下:
1)初始化:除了目的节点,其余节点表项均为(-1,∞)。
2)检查更新:各节点检查其相邻节点表项,如果经过其相邻节点到目的节点的距离小于其当前表项里的Di,则更新表项。
3)重复步骤2),直至节点表项均不变化。
2.Dijkstra算法:
Dijkstra算法是一种查找从源节点到其它所有节点最短路径的算法。该算法维护一个节点集合N,N由那些已经确定的到源节点最近的节点组成。在每次迭代中,把离源节点最近的节点加入N,并计算通过该节点到其余节点的距离。
我们仍以上图为例看一下Dijkstra算法的执行过程:
迭代 | N | D2 | D3 | D4 | D5 | D6 |
初始化 | {1} | 3 | 2 | 5 | ∞ | ∞ |
1 | {1,3} | 3 | 2 | 4 | ∞ | 3 |
2 | {1,2,3} | 3 | 2 | 4 | 7 | 3 |
3 | {1,2,3,6} | 3 | 2 | 4 | 5 | 3 |
4 | {1,2,3,4,6} | 3 | 2 | 4 | 5 | 3 |
5 | {1,2,3,4,5,6} | 3 | 2 | 3 | 5 | 3 |
1)初始化:将源节点1加入集合N,与源节点1相邻的节点初始值为到节点1的距离,其余节点初始值为∞。
2)第1次迭代:检查不在集合N的其余节点到源节点1的最短路径,选择距离最小的那个节点,加入集合N,这里选择节点3。计算通过节点3到源节点的最短路径,若比当前值小,更新最短路径,这里节点4通过节点3到源节点的最短路径为4,你原来小,故更新。同理,节点6也更新。
3)第2次迭代:重复上述过程,这里节点2和节点6到源节点最短距离相等,随机选择一个加入N,这里选择节点2.。更新其余节点。
4)第3次迭代:重复上述过程,将节点6加入N,更新其余节点。
5)第4次迭代:重复上述过程,将节点4加入N,更新其余节点。
6)第5次迭代:将节点5加入集合N,完成算法。
因此,我们将Dijkstra算法总结如下:
1)初始化:将源节点加入集合N,与源节点相邻的节点初始值为到节点的距离,其余节点初始值为∞。
2)检查不在集合N的其余节点到源节点的最短路径,选择距离最小的那个节点,加入集合N,计算其余节点通过该节点到源节点的最短路径,若比当前距离小,则更新。
3)重复步骤2),直至所有节点都在集合N中。