计算机考研408-数据结构-迪杰斯特拉算法(Dijkstra)
一、算法用途
解决最短路径问题,常用于路由算法或者作为其他图的算法的一个子模块。
二、算法背景
迪杰斯特拉算法(Dijkstra)是由荷兰计算机科学家艾兹赫尔·戴克斯特拉(Edsger W. Dijkstra)在1956年提出的一种解决带权有向图中单源最短路径问题的算法。该算法采用贪心策略,逐步找到从源点到其余各个顶点的最短路径。迪杰斯特拉算法的主要特点是从起始点开始,每次遍历到始点距离最近且未访问过的顶点的邻接节点,直到扩展到终点为止。
带权有向图:带权有向图不仅能表示节点间的连接关系,还能通过权重表达关系的强弱或代价。
贪心策略:在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,算法得到的是在某种意义上的局部最优解。
三、算法原理
迪杰斯特拉算法(Dijkstra)的主要特点是从源点开始,每次都遍历到距源点的路线距离最近且未访问过(即未在顶点集)的顶点,直到扩展到终点为止。在算法执行过程中,通过不断更新距离值,逐步逼近最短路径的实际长度。
(注:该算法要求不存在负权边)
四、算法优、缺点
1. 优点
迪杰斯特拉算法(Dijkstra)思想简单、易于理解,可以和好的解决源点到其他顶点的最短路径问题。
2. 缺点
迪杰斯特拉算法(Dijkstra)只适用于权值为正的有向、无向图,权值为负则另选他法。
五、题目解析
如上图所示
V1、V2、V3、V4、V5、V6:带权有向图的5个顶点;
路径:
V1->V3值为10
V1->V6值为100
V2->V3值为50
V3->V4值为50
V4->V6值为10
V5->V4值为20
V5->V6值为60
传统列表结果如下:
源点为V1,终点为V2
没有V1到V2线,所以值为无穷大
源点为V1,终点为V3
V1->V3值为10(最小)
源点为V1,终点为V4
V1->V3->V4值为60
V1->V5->V4值为50(最小)
源点为V1,终点为V5
V1->V5值为30(最小)
源点为V1,终点为V6
V1->V3->V4->V5->V6值为140
V1->V3->V4->V6值为70
V1->V5->V4->V6值为60(最小)
V1->V5->V6值为90
故
路线 | 值 |
---|---|
V1->V1 | 0 |
V1->V2 | ∞ |
V1->V3 | 10 |
V1->V5->V4 | 50 |
V1->V5 | 30 |
V1->V5->V4->V6 | 60 |
使用迪杰斯特拉算法(Dijkstra)进行解答:
第一步,通过分析上图,声明并初始化Distance数组以及顶点集T(由于没有到达V2的路线,我们最后考虑);
Distance[ ] | 值 |
---|---|
Distance[0] : V1->V1 | 0 |
Distance[1] :V1->V2 | ∞ |
Distance[1] : V1->V3 | 10 |
Distance[2] : V1->V4 | ∞ |
Distance[3] : V1->V5 | 30 |
Distance[4] : V1->V6 | 100 |
顶点集T | { V1 } |
---|
第二步,通过对Distance数组的分析可知,V1可到达的有效顶点为V3(10)、V5(30)、V6(100),根据路径值选择最短路径V1->V3值为10,此时将V3加入顶点集。由于V3进入顶点集,同样带来了新的顶点V4及到达V4路线 V1->V3->V4(60),更新Distance数组以及顶点集;
Distance[ ] |
---|