【答案解析】[解析] 目前,求单源最短路径主要使用迪杰斯特拉(Dijkstra)提出的一种按路径长度递增顺序产生各顶点最短路径的算法。若按长度递增的次序生成从源点s到其他顶点的最短路径,则当前正在生成的最短路径上除终点以外,其余顶点的最短路径均己生成(将源点的最短路径看做是已生成的源点到其自身的长度为0的路径)。
迪杰斯特拉算法的基本思想是:设S为最短距离已确定的顶点集(看做红点集),V-S是最短距离尚未确定的顶点集(看做蓝点集)。
(1)初始化:初始化时,只有源点s的最短距离是已知的(SD(s)=0),故红点集S={s},蓝点集为V-{s}。
(2)重复以下工作,按路径长度递增次序产生各顶点最短路径:在当前蓝点集中选择一个距离最小的蓝点来扩充红点集,以保证算法按路径长度递增的次序产生各顶点的最短路径。当蓝点集中仅剩下最短距离为∞的蓝点,或者所有蓝点已扩充到红点集时,s到所有顶点的最短路径就求出来了。
为了叙述方便,我们把图中的中间节点进行编号,如下图所示。
求最短路径的过程如下表所示。
[*]
求最短路径的过程
|
| 红点集 |
D[1] |
D[2] |
D[3] |
D[4] |
D[5] |
D[6] |
D[7] |
D[8] |
D[9] |
D[t] |
| {s} |
25 |
21 |
∞ |
∞ |
∞ |
∞ |
∞ |
∞ |
∞ |
∞ |
| {s,2) |
25 |
|
41 |
46 |
∞ |
∞ |
∞ |
∞ |
∞ |
∞ |
| {s,2,1} |
|
|
41 |
46 |
∞ |
∞ |
36 |
31 |
|
∞ |
| {s,2,1,8) |
|
|
41 |
46 |
∞ |
∞ |
36 |
|
64 |
∞ |
| {s,2,1,8,7} |
|
|
41 |
46 |
71 |
∞ |
|
|
64 |
∞ |
| {s,2,1,8,7,3} |
|
|
|
46 |
61 |
∞ |
|
|
64 |
∞ |
| {s,2,1,8,7,3,4} |
|
|
|
|
61 |
91 |
|
|
64 |
∞ |
| {s,2,1,8,7,3,4,5) |
|
|
|
|
|
69 |
|
|
64 |
82 |
| {s,2,1,8,7,3,4,5,9} |
|
|
|
|
|
69 |
|
|
|
82 |
| {s,2,1,8,7,3,4,5,9,6} |
|
|
|
|
|
|
|
|
|
81 |
| {s,2,1,8,7,3,4,5,9,6,t} |
|
|
|
|
|
|
|
|
|
|
因此,从s到t的最短路径长度为81,路径为s→2→3→5→6→t。根据转弯的定义,其实质就是求从S出发到t,中间至少要经过几个节点,显然,s→2→4→6→t转弯最少,因此最少转弯数为3(注意,试题并没有要求走最短路径)。