Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,理解 Dijkstra(迪杰斯特拉)算法是很必要的,对以后的成长很有帮助,特左此文以作笔记,方便复习。
算法描述:
基本思想:设G(u,v)是加权图,将G上的点分为两组,第一组为集合S(初始只有一个点,即源点,其他点陆续按路径由到长及相邻关系往里加入),第二组为其余未确定最短路径的顶点集合(用U表示,按最短路径长度的递增次序依次把第二组的顶点加入S中,,直到u为空,则算法结束)。在加入的过程中,总保持从源点v到S中各顶点的最短路径长度不大于从源点v到U中任何顶点的最短路径长度。
例子:
步骤 | 集合S | 集合u |
1 | 算法开始,选入u0 | u1-u7 |
2 | 比较u0到u1-u7的距离, u0->u1=2 u0->u2=1 u0->u3=8 u0->u4=00(00表示无穷,下同) u0->u5=00 u0->u6=00 u0->u7=00 选入u2,S=(u0,u2), 路径:u0->u2 u0 选择路径: u0->u2 | u1,u3-u7 |
3 | 比较u0,u0->u2到u1-u9的距离, u0->u1=2 u0->u3=8 u0->u4=00 u0->u5=00 u0->u6=00 u0->u7=00 u0->u2->u3=8 u0->u2->u4=00 u0->u2->u5=00 u0->u2->u6=10 u0->u2->u7=00 选入u1,S=(u0,u1,u2), 路径:u0->u1 u0->u2 u0 选择路径: u0->u1 | u3-u7 |
4 | 比较u0、u0->u1、u0->u2到集合u的各点之间的距离, u0->u3=8 u0->u4=00 u0->u5=00 u0->u6=00 u0->u7=00 u0->u1->u3=10 u0->u1->u4=3 u0->u1->u5=00 u0->u1->u6=00 u0->u1->u7=00 u0->u2->u3=8 u0->u2->u4=00 u0->u2->u5=00 u0->u2->u6=10 u0->u2->u7=00 选入u4,s=(u0,u1,u2,u4) 路径:u0->u1->u4 u0->u1 u0->u2 选择路径:u0->u1->u4 | u5-u7、u3 |
5 | 比较u0、u0->u1、u0->u2、u0->u1->u4到集合u的各点之间的距离, u0->u1=2 u0->u3=8 u0->u4=00 u0->u5=00 u0->u6=00 u0->u7=00 u0->u1->u3=8 u0->u1->u5=00 u0->u1->u6=00 u0->u1->u7=00 u0->u1->u4->u5=6 u0->u1->u4->u6=00 u0->u1->u4->u7=12 u0->u2->u3=8 u0->u2->u4=00 u0->u2->u5=00 u0->u2->u6=11 u0->u2->u7=00 选入u5,s=(u0,u1,u2,u4,u5) 路径:u0->u1->u4->u5 u0->u1->u4 u0->u2 u0->u1 u0 选择路径:u0->u1->u4->u5 | u6-u7、u3 |
6 | 比较u0、u0->u1、u0->u2、u0->u1->u4、u0->u1->u4->u5到集合u的各点之间的距离, u0->u3=8 u0->u6=00 u0->u7=00 u0->u1->u3=8 u0->u1->u5=00 u0->u1->u6=00 u0->u1->u7=00 u0->u1->u4->u6=00 u0->u1->u4->u7=12 u0->u1->u4->u5->u6=7 u0->u1->u4->u5->u7=9 u0->u2->u3=7 u0->u2->u6=9 u0->u2->u7=00 选入u6,s=(u0,u1,u2,u4,u5,u6) 路径:u0->u1->u4->u5->u6 u0->u1->u4->u5 u0->u1->u4 u0->u2 选择路径:u0->u1->u4->u5->u6 | u7、u3 |
7 | 比较u0、u0->u1、u0->u2、u0->u1->u4、u0->u1->u4->u5、u0->u1->u4->u5->u6到集合u的各点之间的距离, u0->u3=8 u0->u7=00 u0->u1->u3=8 u0->u1->u7=00 u0->u1->u4->u3=8 u0->u1->u4->u7=12 u0->u1->u4->u5->u3=7 u0->u1->u4->u5->u7=12 u0->u1->u4->u5->u6->u3=12 u0->u1->u4->u5->u6->u7=13 u0->u2->u3=7 u0->u2->u7=00 选入u3,s=(u0,u1,u2,u4,u5,u6,u3) 路径: u0->u1->u4->u5->u6 u0->u1->u4->u5->u3 u0->u1->u4->u5 u0->u1->u4 u0->u2->u3 u0->u2 u0 选择路径: u0->u1->u4->u5->u3 u0->u2->u3 | u7 |
8 | 比较 u0->u1->u4->u5->u6、 u0->u1->u4->u5->u3、 u0->u1->u4->u5、 u0->u1->u4 u0->u2->u3 u0->u2 u0到集合u的各点之间的距离, u0->u7=00 u0->u2->u7=00 u0->u2->u3->u7=00 u0->u1->u4->u7=12 u0->u1->u4->u5->u7=12 u0->u1->u4->u5->u3->u7=00 u0->u1->u4->u5->u6->u7=13 选入u7,s=(u0,u1,u2,u4,u5,u6,u3 ,u7) 路径: u0->u1->u4->u5->u6->u7 u0->u1->u4->u5->u3->u7 u0->u1->u4->u5->u7 u0->u1->u4->u7 u0->u2->u3->u7 u0->u2->u7 u0->u7 u0 选择路径: u0->u1->u4->u7 u0->u1->u4->u5->u7 | 空(算法结束) |
选出最短路径:u0->u1->u4->u7、u0->u1->u4->u5->u7
以上就是我理解的Dijkstra(迪杰斯特拉)算法的动态过程。(有错误之处,请指正)