小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
第二部分——代码的功能实现。
先给出一图一表。
| s | t | x | y | z | |
|---|---|---|---|---|---|
| s | 6 | 4 | |||
| t | 3 | 2 | |||
| x | 4 | ||||
| y | 1 | 9 | 3 | ||
| z | 7 | 5 |
其中关键的一步是寻找小的路径。我们可以创建一个数组d[5]来存放s到各个点的距离。并且,我们可以通过不断的对d中数据的更新来找到新节点的最小路径。
数组d[5]初始化
我们初始化数组d,让d[s]等于0,而其他值等于无穷大,这里我们将无穷大设置为999.
for(int i=0;i<5;i++)
d[i]=999;
d[s]=0;
d[5]数据更新
既然我们用d[5]来存储路径的长度,那么每当我们找到更短的路径时就要更改d中的数据。
处理s点的边并确定了y点
首先我们从s点出发,结合二维数组,我们能够发现,s有两条路径,s->t,s->z。
| s | t | x | y | z | |
|---|---|---|---|---|---|
| s | 6 | 4 |
我们进行比较,原先在t,z两处的数据值为999,所以将999替换。
图中红圈的s点表示当前处理点,绿色区域表示填入s->t,s->y的值。
处理y点的边并确定了t点
| s | t | x | y | z | |
|---|---|---|---|---|---|
| y | 1 | 9 | 3 |
图中橙色圈出的s表示已确定点,红色圈出的y表示当前处理点,绿色表示将y->x,y->z的值填入,注意此处表示的并不只是y->x或y->x的值,而是要加上y出本身的值,真正含义是s->y->x,s->y->z的值。其中蓝色区域表示更换的值,找到更短的路。
我们找出最短的一个结点,确定下来.
处理t点的边并确定了z点
| s | t | x | y | z | |
|---|---|---|---|---|---|
| t | 3 | 2 |
这里我们比较t->y的值为7,大于了4,所以不做更换
处理z点的边并确定了x点
代码
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];
}
}
}