算法原理
对于单一源头计算最短路径的问题,可以使用Dijsktra算法。
假设这样一个问题:有n个节点,以及节点间的距离数据,求从原点s到任意其他节点的最短距离。算法步骤主要是
-
构造一个距离数组**dist[n]表示原点到其他节点的距离,其中到自身的距离为0,如果无法直接到达节点,则距离用无穷大表示。
-
每次从***dist***数组中选出距离原点最近并且没有被标记为确定最短距离的节点***k***,并标记为已经确定最短距离。
-
然后利用松弛边的思想来更新原点到其他节点的最短距离,只要满足了条件
dist[d] > dist[k] + w[k][d]
,就表示可以利用中间节点k来让原点到节点***d***的距离变得更短。 -
重复步骤2-3,直到所有的的节点都被标记为确定状态。
算法的伪代码示例如下。
public void Dijsktra(int n, int s, int[][] weight) {
boolean[] visited = new boolean[n];
int[] dist = new int[n];
/* 省略构造填充dist的代码 */
for (int i = 0; i < n; i++) {
int minValue = Integer.MAX_VALUE;
int k = 0;
/* 找出当前距离s最近的中间节点k */
for (int j = 0; j < n; j++) {
if (!visited[j] && dist[j] < minValue) {
k = j;
}
}
/* 标记k为确定最短距离状态 */
visited[k] = true;
for (int j = 0; j < n; j++) {
if (dist[j] > dist[k] + weight[k][j]) {
/* 根据中间节点k进行边的松弛 */
dist[j] = dist[k] + weight[k][j];