您当前的位置: 首页 >  Java

小志的博客

暂无认证

  • 0浏览

    0关注

    1217博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

java数据结构和算法——迪杰斯特拉(Dijkstra)算法

小志的博客 发布时间:2020-12-03 22:01:31 ,浏览量:0

目录
    • 一、迪杰斯特拉(Dijkstra)算法介绍
    • 二、迪杰斯特拉(Dijkstra)算法过程
    • 三、迪杰斯特拉(Dijkstra)算法——应用场景(最短路径问题)
    • 四、迪杰斯特拉(Dijkstra)算法——解决最短路径问题的思路图解
    • 五、迪杰斯特拉(Dijkstra)算法——解决最短路径问题的代码实现

一、迪杰斯特拉(Dijkstra)算法介绍
  • 迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个结点到其他结点的最短路径。 它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止。
二、迪杰斯特拉(Dijkstra)算法过程
  • 设置出发顶点为v,顶点集合V{v1,v2,vi…},v到V中各顶点的距离构成距离集合Dis,Dis{d1,d2,di…},Dis集合记录着v到图中各顶点的距离(到自身可以看作0,v到vi距离对应为di)
  • 从Dis中选择值最小的di并移出Dis集合,同时移出V集合中对应的顶点vi,此时的v到vi即为最短路径
  • 更新Dis集合,更新规则为:比较v到V集合中顶点的距离值,与v通过vi到V集合中顶点的距离值,保留值较小的一个(同时也应该更新顶点的前驱节点为vi,表明是通过vi到达的)
  • 重复执行两步骤,直到最短路径顶点为目标顶点即可结束
三、迪杰斯特拉(Dijkstra)算法——应用场景(最短路径问题)

战争时期,胜利乡有7个村庄(A, B, C, D, E, F, G) ,现在有六个邮差,从G点出发,需要分别把邮件分别送到 A, B, C , D, E, F 六个村庄;各个村庄的距离用边线表示(权) ,比如 A – B 距离 5公里;问:如何计算出G村庄到 其它各个村庄的最短距离? 如果从其它点出发到各个点的最短距离又是多少?

在这里插入图片描述

四、迪杰斯特拉(Dijkstra)算法——解决最短路径问题的思路图解

在这里插入图片描述

五、迪杰斯特拉(Dijkstra)算法——解决最短路径问题的代码实现

1、邻接矩阵如下图: 在这里插入图片描述

2、代码

package com.rf.data_structure_algorithm.algorithm.dijkstra;
import java.util.Arrays;
/**
 * @description: 迪杰斯特拉算法
 * @author: xiaozhi
 * @create: 2020-11-26 21:28
 */
public class DijkstraAlgorithm {
    public static void main(String[] args) {
        //定义顶点数组
        char[] vertex={'A','B','C','D','E','F','G'};
        //定义邻接矩阵
        int[][] matrix=new int[vertex.length][vertex.length];
        //N:表示不可以连接
        final int N = 65535;
        matrix[0]=new int[]{N,5,7,N,N,N,2};
        matrix[1]=new int[]{5,N,N,9,N,N,3};
        matrix[2]=new int[]{7,N,N,N,8,N,N};
        matrix[3]=new int[]{N,9,N,N,N,4,N};
        matrix[4]=new int[]{N,N,8,N,N,5,4};
        matrix[5]=new int[]{N,N,N,4,5,N,6};
        matrix[6]=new int[]{2,3,N,N,4,6,N};
        //创建 Graph对象
        Graph graph = new Graph(vertex, matrix);
        //测试, 看看图的邻接矩阵是否ok
        graph.showGraph();
        //测试迪杰斯特拉算法
        graph.dsj(2);//C
        graph.showDijkstra();
    }

}
/** 
* @Description: 创建图
* @Author: xz
* @Date: 2020/11/26 21:29
*/ 
class Graph{
    char[] vertex; // 顶点数组
    int[][] matrix;// 邻接矩阵
    VisitedVertex vv; //已经访问的顶点的集合

    //构造方法
    public Graph(char[] vertex, int[][] matrix) {
        this.vertex = vertex;
        this.matrix = matrix;
    }

    //显示结果
    public void showDijkstra() {
        vv.show();
    }

    // 显示图
    public void  showGraph(){
        for(int[] link :matrix){
            System.out.println(Arrays.toString(link));
        }
    }
    /**
    * @Description: 迪杰斯特拉算法实现
    * @Param:  index 表示出发顶点对应的下标
    * @Author: xz  
    * @Date: 2020/11/26 21:56
    */ 
    public void dsj(int index) {
        vv = new VisitedVertex(vertex.length, index);
        update(index);//更新index顶点到周围顶点的距离和前驱顶点
        for(int j = 1; j             
关注
打赏
1661269038
查看更多评论
0.0629s