深入理解Dijkstra算法

本文深入探讨了Dijkstra算法,旨在理解其在解决加权连通简单图中最短路径问题的应用。通过四步解释算法过程,并用Java实现,阐述了如何利用邻接矩阵存储图结构,并展示算法如何逐步找到最短路径。
摘要由CSDN通过智能技术生成

最近由于科研项目需要深入理解Dijkstra算法,发现该算法虽然之前看过两遍但还是没有彻底理解,今天来详细解析一下,并用Java实现。

Dijkstra算法求解的是加权连通简单图中一个顶点到其他每个顶点的具有最小权和的有向路径。最简单版本的时间复杂度为O(n^2),是多项式时间算法。该算法是利用了一种广度优先搜索的思想,从起始点开始逐个向外扩散直到遍历完所有节点。

该算法主要分为以下四步:

     0. 需要引进两个集合S和U,S的作用是记录已经求出最短路径的顶点以及相应的最短路径长度,U的作用是记录还未求出最短路径的顶点以及该顶点到起始点的距离。

  1. 初始时,S只包含起点s;U包含除s外的其他顶点,且U中顶点的距离为起点s到该顶点的距离,如果这两点之间没有直接路径,则距离为无穷大;
  2. 从U中选出“距离最短的顶点k”,并将顶点k加入到S中,同时从U中移除顶点k;
  3. 利用k更新U中各个顶点到起点s的距离,因为(s,v)的距离可能大于(s,k)+(k,v)的距离;
  4. 重复步骤2、3,直到U为空。

在Java实现中,使用图的邻接矩阵存储结构,需要两个数组,一个一维数组存储图中的顶点信息,一个二维数组存储图中边的信息。

public class MatrixUDG {
    private int mEdgNum;// the number of edge
    private char[] mVexs;// the number of vertex
    private int[][] mMatrix;// adjacency matrix
    private static final int INF &
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值