迪杰斯塔拉算法(二)2.2

136 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

2.2

上一篇我们解决了如何获取最短路径的问题,并得出了代码。

迪杰斯塔拉算法(二) - 掘金 (juejin.cn)

int x=s; for(int i=0;i<4;i++){
    for(int j=0;j<5;j++){ 
        if(g[x][j]+d[x]<d[j]){ 
            d[j]=g[x][j]+d[x]; 
        }
    }
}

但这里我们只是更新d数组,即每次从一个点出发得出最短的路径,还有一个关键的部分没有实现。如下图所示,当我们将s到相邻点的路径更新后,确定y点呢? image.png

当然我们肉眼直观可见,下一个点就是y,因为y的值最小,实现起来也很简单,遍历数组找最小值就行了。但是我们再看从y更新d数组后的情况。

image.png 此时,我们应确定图中除s、y的最小值下标。即确定t点。但我们该如何实现呢?

1.新状态数组

我们可以重新设置一个长度为5的数组state[5],将其初始值设置为0,当这个点确定过后,将state对应下标设置为1,每次找确定点找最小值时,在判断state[i]是否为0。

2.取负值

方法一当然是可以达成目标的。但方法二可以不用新创建数组达成目的。那就是我们将所有确定点的d数组值设为相反数。如下图所示。

image.png 我们确定了y点,在将y值所有的相邻点最短路径更新到d中后,将d[y]=-d[y],再在d中找大于0的最小值,确定出了t点。

image.png 同样的,我们再处理完t点后,将d[t]=-d[t],再查找大于0的最小值。