当前位置: 首页 > article >正文

迪杰斯特拉(Dijkstra)算法

一、迪杰斯特拉--算法思想

按从某顶点到其它顶点的路径长度递增的方式,逐渐求到各顶点的最短路径。

           设给定源点为Vs,S为已求得最短路径的终点集,开始时令S={Vs} 。当求得第一条最短路径(Vs ,Vi)后,S为{Vs,Vi} 。根据以下结论可求下一条最短路径。

         设下一条最短路径终点为Vj ,则Vj只有:

  源点到终点有直接的弧<Vs,Vj>;

从Vs 出发到Vj 的这条最短路径所经过的所有中间顶点必定在S中。即只有这条最短路径的最后一条弧才是从S内某个顶点连接到S外的顶点Vj

          若定义一个数组dist[n],其每个dist[i]分量保存从Vs 出发中间只经过集合S中的顶点而到达Vi的所有路径中长度最小的路径长度值,则下一条最短路径的终点Vj必定是不在S中且值最小的顶点,即:

           dist[i]=Min{ dist[k]| Vk∈V-S }

       利用上述公式就可以依次找出下一条最短路径。

二、迪杰斯特拉算法--数据组织

  数据源
  已确定结点集 S
  待选结点集 V-S
  结点临时最短路径长度
  结点临时最短路径

三、迪杰斯特拉算法—步骤

令S={Vs} ,用带权的邻接矩阵表示有向图,对图中每个顶点Vi按以下原则置初值:

选择一个顶点Vj ,使得:

                                          Distance[j]=Min{ Distance[k]| Vk∈V-S }

Vj就是求得的下一条最短路径终点,将Vj 并入到S中,即S=S∪{Vj} 。

对V-S中的每个顶点Vk ,修改dist[k],方法是:

Distance[j]+Wjk<Distance[k],则修改为:

Distance[k]=Distance[j]+Wjk ("Vk∈V-S )

重复②,③,直到S=V为止。

四、迪杰斯特拉算法—实现

void Dijkstra(MGraph g,int start, int end)
{
    int dist[MAXV], path[MAXV];
    int s[MAXV];
    int mindis, i, j, u;
    for(i = 0; i < g.n; i ++)
    {
        dist[i] = g.edges[start][i];//dist数组初始化
        s[i] = 0;
        if(g.edges[start][i] < INF) 
			path[i] = start;
        else 
			path[i] = -1;        // path数组初始化
    } 
    s[start] = 1;                       //顶点start加入顶点集合s
	path[start] = 0;

    for(i = 0; i < g.n; i ++)//选择不在集合s中且具有最短路径的顶点
    {
        mindis = INF;
        for(j = 0; j < g.n; j ++)
        {
            if(s[j] == 0 && dist[j] < mindis)
            {
                u = j;
                mindis = dist[j];
            }    
        }    
s[u] = 1;//将顶点u加入集合
        for (j = 0; j < g.n; j ++)//修改dist和path
        {
            if (s[j] == 0)
            {
				if ((g.edges[u][j] < INF) && (dist[u] + g.edges[u][j] < dist[j]))
                {
                    dist[j] = dist[u] + g.edges[u][j];
                    path[j] = u;
                }    
            }    
        }    
    } 
    Dispath(g, dist, path, s, g.n, start, end);     
} 

五、Dijkstra算法--数据组织 

六、Dijkstra算法—例子

七、Dijkstra算法—算法分析

Dijkstra算法的主要执行是:

数组变量的初始化:时间复杂度是O(n) ;

求最短路径的二重循环:时间复杂度是O(n2) ;

        因此,整个算法的时间复杂度是O(n2) 。

0利用Dijkstra算法填写表格求图中从顶点a到其他各顶点间的最短路径,并写出最终结果。

终点

Dist

b

c

D

e

f

g

S(终点集)

k=1

15

2

12

c

k=2

15

12

10

6

C,f

k=3

15

11

10

16

C,e,f

k=4

k=5

k=6


    http://www.kler.cn/a/529321.html

    相关文章:

  1. Mybatis-plus缓存
  2. Spring的AOP思想中事物管理注意点
  3. Spring JDBC:简化数据库操作的利器
  4. 使用大语言模型在表格化网络安全数据中进行高效异常检测
  5. RRT_STAR路径规划代码
  6. 离散化C++
  7. “新月之智”智能战术头盔系统(CITHS)
  8. 抖♬♬__ac_signature 算法逆向分析
  9. mybatis辅助配置
  10. 计算机组成原理——存储系统(一)
  11. 42. PWM背光实验
  12. HAL库W25Qxx系列芯片驱动
  13. C++STL之stack和queue容器(详细+通俗易懂)
  14. 课设:【ID0022】火车票售票管理系统(前端)
  15. Qt 5.14.2 学习记录 —— 이십이 QSS
  16. 【AI文章解读】《No, DeepSeek Is Not A ‘Sputnik Moment’》
  17. 信息学奥赛一本通 ybt 1608:【 例 3】任务安排 3 | 洛谷 P5785 [SDOI2012] 任务安排
  18. 制造业数字化转型:从标准化设备到数据与智能算法的共生革命
  19. 《基于单中心损失监督的频率感知判别特征学习用于人脸伪造检测 》学习笔记
  20. PostgreSQL 数据库视图基础操作
  21. tf.Keras (tf-1.15)使用记录1-基础模型创建的两种方法
  22. 【股票数据API接口48】如何获取股票最新分时BOLL数据之Python、Java等多种主流语言实例代码演示通过股票数据接口获取数据
  23. 【Python】理解Python中的协程和生成器:从yield到async
  24. PostgreSQL 数据库备份与还原
  25. 如何使用SliverList组件
  26. 数据分析系列--⑨RapidMiner训练集、测试集、验证集划分