迪杰斯特拉算法
单源点路径
- 数组D[i]来存储最短路径,以初始点进行初始化。
- 找到当前D[i]中最短的路径D[j],即确定当前最短。
- 以Vj为中中转点,更新D[i],即如果D[i]>D[j]+arcs[j][i],就D[i]=D[j]+arcs[j][i]赋值操作;再继续重复第2步。
- 直至该单源点到所有顶点的最短路径都以确定。
初始化
0 | 1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|---|
0 | ∞ | 10 | ∞ | 30 | 100 |
当前最短是D[2] == 10,所以下一步以V2为中转点,更新D;
D[1]== ∞ , D[2] +arcs[2][1] == ∞,所以D[3] = ∞;
D[3]== ∞ > D[2] +arcs[2][3] == 60,所以D[3] = 60;
D[4]== 30 < D[2] +arcs[2][4] == ∞,所以D[3] = 30;
D[4]==100 > D[2] +arcs[2][5] == ∞,所以D[3] = 100;
0 | 1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|---|
0 | ∞ | 10 | 60 | 30 | 100 |
当前最短是D[4] == 30,所以下一步以V4为中转点,更新D;
0 | 1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|---|
0 | ∞ | 10 | 50 | 30 | 90 |
当前最短是D[3] == 50,所以下一步以V5为中转点,更新D;
0 | 1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|---|
0 | ∞ | 10 | 50 | 30 | 60 |
当前最短是D[3] == 50,最短路径全部求出,结束。
0 | 1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|---|
0 | ∞ | 10 | 50 | 30 | 60 |
弗洛伊德算法
每一对顶点之间的最短路径
进行N次的迪杰斯特拉算法,也可以求出这个结果。
弗洛伊德算法步骤:
需要两个二维数组D,P;其中D是存储各顶点间额最短路径,P是存储中转点。
- 初始两个数组。
- 以Vk(k∈(0,n))为中转点,如果D[i][j] >D[i][k]+D[k][j],就D[i][j] =D[i][k]+D[k][j]赋值更新D[i][j],即Vi到Vj的最短路径;且P[i][j]=k。已直重复第2步。
- 直到以Vn为中转点,D,P更新结束。