小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
2.2
上一篇我们解决了如何获取最短路径的问题,并得出了代码。
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点呢?
当然我们肉眼直观可见,下一个点就是y,因为y的值最小,实现起来也很简单,遍历数组找最小值就行了。但是我们再看从y更新d数组后的情况。
此时,我们应确定图中除s、y的最小值下标。即确定t点。但我们该如何实现呢?
1.新状态数组
我们可以重新设置一个长度为5的数组state[5],将其初始值设置为0,当这个点确定过后,将state对应下标设置为1,每次找确定点找最小值时,在判断state[i]是否为0。
2.取负值
方法一当然是可以达成目标的。但方法二可以不用新创建数组达成目的。那就是我们将所有确定点的d数组值设为相反数。如下图所示。
我们确定了y点,在将y值所有的相邻点最短路径更新到d中后,将d[y]=-d[y],再在d中找大于0的最小值,确定出了t点。
同样的,我们再处理完t点后,将d[t]=-d[t],再查找大于0的最小值。