描述

算法过程

代码实现

package com.atguigu.dijkstra;import com.sun.xml.internal.fastinfoset.algorithm.BooleanEncodingAlgorithm;import javax.sound.midi.Soundbank;
import java.util.Arrays;
import java.util.TimerTask;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];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);//测试看看图的邻接矩阵是否OKgraph.showGraph();//测试算法graph.dsj(2);//cgraph.showDijkstra();}}class Graph {private char[] vertex;//顶点数组private int[][] matrix;//邻接矩阵private 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));}}//迪杰斯特拉算法实现/**** @param index 表示出发顶点对应的下标*/public void dsj(int index){vv = new VisitedVertex(vertex.length, index);update(index);//更新index顶点到周围顶点的距离和前驱顶点for (int j = 1; j < vertex.length; j++) {index=vv.updateArr();//选择并返回新的访问顶点update(index);//更新index顶点到周围顶点的距离和前驱顶点}}//更新index下标顶点到周围顶点的距离和周围顶点的前驱顶点private void update(int index){int len=0;//根据遍历我们的邻接矩阵的matrix[index].length行for (int j = 0; j < matrix[index].length; j++) {//len含义是:出发顶点到index顶点的距离+从index顶点到j顶点的距离的和len=vv.getDis(index)+matrix[index][j];//如果j顶点没有被访问过,并且len小于出发顶点到j顶点的距离,就需要更新if(!vv.in(j)&&len<vv.getDis(j)){vv.updatePre(j,index);//更新j顶点的前驱为index顶点vv.updateDis(j,len);//更新出发顶点到j顶点的距离}}}}// 已访问顶点集合
class VisitedVertex {// 记录各个顶点是否访问过 1表示访问过,0未访问,会动态更新public int[] already_arr;// 每个下标对应的值为前一个顶点下标, 会动态更新public int[] pre_visited;// 记录出发顶点到其他所有顶点的距离,比如G为出发顶点,就会记录G到其它顶点的距离,会动态更新,求的最短距离就会存放到dispublic int[] dis;//构造器/***** @param length 表示顶点的个数* @param index 出发顶点对应的下标,比如G顶点,下标是6*/public VisitedVertex(int length,int index){this.already_arr=new int[length];this.pre_visited=new int[length];this.dis=new int[length];//初始化dis数组Arrays.fill(dis,65535);this.already_arr[index]=1;//设置出发顶点被访问过this.dis[index]=0;//是指出发顶点的访问距离为0}/*** 判断index顶点是否被访问过* @param index* @return 如果访问过,就返回true,否则返回false*/public boolean in(int index){return already_arr[index]==1;}/*** 更新出发顶点到index顶点的距离* @param index* @param len*/public void updateDis(int index,int len){dis[index]=len;}/*** 更新pre这个顶点的前驱为index的顶点* @param pre* @param index*/public void updatePre(int pre,int index){pre_visited[pre]=index;}/*** 返回出发顶点到index顶点的距离* @param index*/public int getDis(int index){return dis[index];}//继续选择并返回新的访问顶点,比如这里的G完后,就是A点作为新的访问顶点(注意不是新节点)public int updateArr(){int min=65535,index=0;for (int i = 0; i < already_arr.length; i++) {if(already_arr[i]==0&&dis[i]<min){min=dis[i];index=i;}}//更新index顶点被访问过already_arr[index]=1;return index;}//显示最后的结果//即将三个数组的情况输出public void show(){System.out.println("=================");//输出already_arrfor(int i:already_arr){System.out.print(i+" ");}System.out.println("=================");//输出pre_visitedfor(int i:pre_visited){System.out.print(i+" ");}System.out.println("=================");//输出disfor(int i:dis){System.out.print(i+" ");}System.out.println();//为了好看最后的最短距离,我们处理char[] vertex = {'A', 'B', 'C', 'D', 'E', 'F', 'G'};int count=0;for(int i:dis){if(i!=65535){System.out.print(vertex[count]+"("+i+")");}else{System.out.println("N");}count++;}System.out.println();}}

迪杰斯特拉算法(最短路径)相关推荐

  1. MATLAB轻松绘制地图路线——Dijkstra(迪杰斯特拉)算法最短路径规划

    文章目录 1. 地图绘制 2. 计算各节点之间的距离 3. Dijkstra(迪杰斯特拉)算法 4. 根据计算出的距离利用Dijkstra(迪杰斯特拉)算法找出指定节点之间的最短路径 工程文件(可直接 ...

  2. 迪杰斯特拉算法——最短路径

    分析过程: 需要构建的有向图和最短路径 分析每次取出里面的最短路径 程序执行的过程: 代码块: 迪杰斯特拉算法 : #include<stdio.h> #include<string ...

  3. [ 数据结构 ] 迪杰斯特拉算法(最短路径问题)

    0 最短路径问题 战争时期,胜利乡有 7 个村庄(A, B, C, D, E, F, G) ,现在有六个邮差,从 G 点出发,需要分别把邮件分别送到 A, B, C , D, E, F 六个村庄 各个 ...

  4. 【算法】迪杰斯特拉算法 最短路径算法

    文章目录 1.概述 1.1 算法介绍 1.2 算法过程 2.代码 1.概述 太难了:https://www.bilibili.com/video/BV1E4411H73v?p=178 应用场景如下 战 ...

  5. C++——迪杰斯特拉算法弗洛伊德算法(DijkstraFloyd)for Neuedu

    采用迪杰斯特拉算法和弗洛伊德算法 求出两个景点间的最短路径和最短距离 例如下图所示的无向图: 通过输入节点个数和线路条数,分别输入各线路权值进行计算最短(最优)线路. Ps:使用Qt进行编译运行 /* ...

  6. C++迪杰斯特拉算法求最短路径

    一:算法历史 迪杰斯特拉算法是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题.迪杰斯特拉算法主要特点是以 ...

  7. 单源最短路径-Dijkstra(迪杰斯特拉算法)

    迪杰斯特拉算法时间复杂度为O(n^2),其中n为顶点个数. 该算法用于求单源最短路径.并且图中的边不允许带负权值. #include <iostream> using namespace ...

  8. 最短路径(迪杰斯特拉算法)

    1 构造图 2 代码 package leaning.graph;/** 迪杰斯特拉算法求最短路径* * */ public class Dijkstra {// 表示V0顶点到v8顶点的最短路径的值 ...

  9. 最短路径——迪杰斯特拉算法——图的数据结构

    最短路径是在工程上经常用到的概念,在这里给出了从单源点到任意顶点的迪杰斯特拉算法. 先来看看基本概念: 用代码C语言实现如下: #include<string.h>#include< ...

最新文章

  1. 避免使用aireplay-ng指令时出现AP通道不对的方法
  2. 用实例证明dll中new的内存不能在exe中释放
  3. 开了gomod不识别gopath_笔记本电脑开不了机原因 笔记本电脑开不了机解决方法【图文】...
  4. java 下拉列表 枚举_「Java三分钟」精准而优雅——枚举类详解
  5. 2017蓝桥杯省赛---java---B---10(k倍区间)
  6. Unknown column 'password_lifetime' in 'field list';创建数据库时创建用户,修改用户时报错
  7. java 导出文件上传模板,上传Excel文件批量导入数据
  8. 客户端持久化解决方案: Web SQL
  9. Docker容器数据卷-Volume小结
  10. 【英雄联盟动画-双城之战】10点首播!6亿召唤师快来
  11. Bootstrap Timepicker
  12. C# 批量修改文件名称
  13. 4个平面设计小技巧:让视觉主题更突出——黎乙丙
  14. RTOS 诊断和错误检查
  15. python计算梯形面积_Python代码分享:面积计算器3.0代码
  16. 使用android studio 连接海马玩模拟器
  17. html5 meta keywords,HTML中meta标签及Keywords介绍
  18. Python处理视频实现特效案例十二则
  19. Vue-Router学习记录
  20. QtCreator代码对齐的方法

热门文章

  1. icoding复习1,2
  2. java安装版本哪种好_我怎么知道我安装了哪个版本的Java?
  3. 解决module ‘tensorflow‘ has no attribute ‘optimizers‘报错
  4. mmdnn cannot import caffe
  5. Java ASM与Javassit
  6. 2019-03-22-算法-进化(回文链表)
  7. 【NOI online 2】游戏【二项式反演】【树上背包】
  8. 2021牛客第一场H.Hash Function—FFT求差值的卷
  9. P3327 [SDOI2015]约数个数和
  10. P6242-[模板]线段树3【吉司机线段树】