迪杰斯塔拉算法(二)

230 阅读2分钟

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

第二部分——代码的功能实现。

先给出一图一表。

image.png

stxyz
s64
t32
x4
y193
z75

其中关键的一步是寻找小的路径。我们可以创建一个数组d[5]来存放s到各个点的距离。并且,我们可以通过不断的对d中数据的更新来找到新节点的最小路径。

数组d[5]初始化

我们初始化数组d,让d[s]等于0,而其他值等于无穷大,这里我们将无穷大设置为999.

for(int i=0;i<5;i++)
    d[i]=999;
d[s]=0;

image.png

d[5]数据更新

既然我们用d[5]来存储路径的长度,那么每当我们找到更短的路径时就要更改d中的数据。

处理s点的边并确定了y点

首先我们从s点出发,结合二维数组,我们能够发现,s有两条路径,s->t,s->z。

stxyz
s64

我们进行比较,原先在t,z两处的数据值为999,所以将999替换。

image.png 图中红圈的s点表示当前处理点,绿色区域表示填入s->t,s->y的值。

处理y点的边并确定了t点

stxyz
y193

image.png 图中橙色圈出的s表示已确定点,红色圈出的y表示当前处理点,绿色表示将y->x,y->z的值填入,注意此处表示的并不只是y->x或y->x的值,而是要加上y出本身的值,真正含义是s->y->x,s->y->z的值。其中蓝色区域表示更换的值,找到更短的路。

我们找出最短的一个结点,确定下来.

处理t点的边并确定了z点

stxyz
t32

这里我们比较t->y的值为7,大于了4,所以不做更换 image.png

处理z点的边并确定了x点

image.png

代码

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];
        }
    }
}