赞
踩
适用于计算一个顶点到其他所有
直接结合题目分析
【例】
分析上图从源点a到其它各顶点的最短路径:
第一趟:从源点a出发,到b,代价是2;a到c代价是5,取小者,加入集合S={a,b}
第二趟:从b出发,可以到c和d,a->b->c代价是3(比a直接到c的代价5要小,保留),a->b->d代价是5,取小者加入集合S={a,b,c}
第三趟:从c出发,可以到d,e,f;a->b->c->d代价是6(比a->b->d代价5要大,需要更新)更新为a->b->d代价5;a->b->c->e代价是7;a->b->c->f代价是4;取小者4加入集合S={a,b,c,f}
第四趟:从f出发,还剩下顶点d和e,即就是a->b->c->f->d代价是∞(比a->b->d代价5要大,需要更新)更新为a->b->d代价5;a->b->c->f->e代价是∞(比a->b->c->e代价7要大,需要更新)更新为a->b->c->e代价7;取小者5加入集合S={a,b,c,f,d}
第五趟:只剩下e,直接加入集合S={a,b,c,f,d,e}
【例2】
分析上图从顶点1到其它各顶点的最短路径:
第一趟:从顶点1出发到2,代价是5;1到5代价是4,取小者,加入集合S={1,5}
第二趟:从5出发,可以到2,4,6,1->5->2代价是10(比1直接到2的代价5要大,舍弃)取1到2代价5;1->5->4代价是11;1->5->6代价是9;取小者加入集合S={1,5,2}
第三趟:从2出发,可以到3,4,1->2->3代价是7;1->2->4代价是14(比1->5->4代价是11要大,舍弃)取1->5->4代价11;取小者加入集合S={1,5,2,3}
第四趟:同理,取小者加入集合S={1,5,2,3,6}
第五趟:只剩下4,直接加入集合S={1,5,2,3,6,4}
【例】(2022年8题)如下图,从顶点1到2,3,4,5的最短路径保存在dist中,求出第二条最短路径后,dist中的内容更新为____.(选C)
A. 26,3,14,6
B. 25,3,14,6
C.21,3,14,6
D.15,3,14,6
首先初始化三个数组信息:
1.标记各顶点是否已找到最短路径:final[]
2.最短路径长度:dist[]
3.每一个顶点在最短路径上的直接前驱:path[]
顶点 | v2 | v3 | v4 | v5 |
---|---|---|---|---|
final | false | false | false | false |
dist | 26 | 3 | ∞ | 6 |
path | 1 | 1 | ∞ | 1 |
寻找第一条最短路径:循环遍历所有顶点,找到还没确定最短路径(即final值为false),且dist最小的顶点v3,令其final值为true。并且检查所有邻接自v3的顶点,若其final值为false,并且走v3路径代价更小的话,则更新dist和path信息。(这里更新了v2的dist和path信息,因为从v1->v3->v2的代价25比v1->v2代价26要小)
顶点 | v2 | v3 | v4 | v5 |
---|---|---|---|---|
final | false | true | false | false |
dist | 25 {\color{Orange} 25} 25 | 3 | ∞ | 6 |
path | 3 {\color{Orange} 3} 3 | 1 | ∞ | 1 |
寻找第二条最短路径:同上(这里进一步更新了v2的dist和path信息,因为从v1->v5->v2的代价21要更小些;更新了v4,从v1->v5->v4有了路径,代价为14)
顶点 | v2 | v3 | v4 | v5 |
---|---|---|---|---|
final | false | true | false | true |
dist | 21 {\color{Orange} 21} 21 | 3 | 14 {\color{Orange} 14} 14 | 6 |
path | 5 {\color{Orange} 5} 5 | 1 | 5 {\color{Orange} 5} 5 | 1 |
适用于一对一顶点,求每对顶点之间的最短路径
使用动态规划思想,将问题的求解分为多个阶段
【例】
初始:不允许经过其它顶点中转的最短路径
各顶点之间的最短路径A(-1):
两个顶点之间的中转点path(-1):(初始时都没有中转点)
下一步,若允许在V0中转的最短路径:
A(0):
path(0):
下一步,若允许在V0,V1中转的最短路径:
A(1):
path(1):
下一步,若允许在V0,V1,V2中转的最短路径:
A(2):
path(2):
根据A(2)可知,V1到V2的最短路径长度为4,V0到V2的最短路径长度为10,同时结合path(2)可知,V1到V2的完整路径信息为V1->V2;V0到V2的完整路径信息为V0->V1->V2
【例】
初始:不允许经过其它顶点中转的最短路径
各顶点之间的最短路径A(-1):
两个顶点之间的中转点path(-1):(初始时都没有中转点)
#1:若允许在V0,V1中转的最短路径
原本V2没有直接到V3的路径,经过V1中转,V2->V1->V3代价为2;同样V2->V1->V4代价更新为6;对应的path更新为1,代表从V1结点进行了中转;
#2:若允许在V0,V1,V2中转的最短路径
同理,原本V0没有直接到V1的路径,经过V2中转,V0->V2->V1代价为2;这里需要说明的是,从V0到V3,可以经过了V2中转,由于从上一步已经得出了从V0到V2经过了V1中转,于是从V0到V3的完整路径其实是V0>V2->V1>V3,代价是3;从V0到V4原本代价是10,经过V2中转,V0>V2->V1>V4,代价更新为7;
#3:若允许在V0,V1,V2,V3中转的最短路径
#4:若允许在V0,V1,V2,V3,V4中转的最短路径
经过这一步,发现任何地方都不需要修改
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。