import java.util.Arrays;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);// C为出发点// 打印结果graph.showDijkstra();}
}class Graph {private char[] nodes; // 节点数组private int[][] matrix; // 邻接矩阵private NodesInfo nodesInfo; // 访问节点后的记录信息// 构造器public Graph(char[] vertex, int[][] matrix) {this.nodes = vertex;this.matrix = matrix;}// 输出结果public void showDijkstra() {nodesInfo.show();}// 输出图public void showGraph() {for (int[] link : matrix) {System.out.println(Arrays.toString(link));}}/*** 迪杰斯特拉算法实现* * @param index 表示出发节点对应的下标*/public void dsj(int index) {nodesInfo = new NodesInfo(nodes.length, index);update(index);// 更新index节点到周围节点的距离、周围节点的前驱节点// 访问其余的vertex.length-1个节点for (int j = 1; j < nodes.length; j++) {index = nodesInfo.findNextNode();// 找到一个[到已经访问过的所有节点的最近距离最小]的节点update(index); // 更新index节点到周围节点的距离、周围节点的前驱节点}}/*** 更新index下标节点到周围节点的距离、周围节点的前驱节点* * @param index*/private void update(int index) {int curLen = 0;// 遍历邻接矩阵的 matrix[index] 行for (int j = 0; j < matrix[index].length; j++) {// len = 出发节点到index节点的距离 + 从index节点到j节点的距离curLen = nodesInfo.getLenFromBegin(index) + matrix[index][j];// j节点没有被访问过,并且距离出发点小于表中记录if (!nodesInfo.hasVisited(j) && curLen < nodesInfo.getLenFromBegin(j)) {nodesInfo.setPreNode(j, index); // 更新j节点的前驱为index节点nodesInfo.setLenFromBegin(j, curLen); // 更新出发节点到j节点的距离}}}
}// 已访问节点集合
class NodesInfo {// 下标对应节点是否访问过: 1=访问过 0=未访问public int[] visitedFlag;// 下标对应节点的前驱public int[] preNode;// 记录出发节点到其他所有节点的距离public int[] lenFromBegin;/*** 构造器* * @param length :表示节点的个数* @param index: 出发节点。 比如G节点下标是6*/public NodesInfo(int length, int index) {this.visitedFlag = new int[length];this.preNode = new int[length];this.lenFromBegin = new int[length];// 初始化 dis数组Arrays.fill(lenFromBegin, 65535);this.visitedFlag[index] = 1; // 设置出发节点被访问过this.lenFromBegin[index] = 0;// 设置出发节点的访问距离为0}/*** 功能: 判断index节点是否被访问过* * @param index* @return 如果访问过,就返回true, 否则访问false*/public boolean hasVisited(int index) {return visitedFlag[index] == 1;}/*** 功能: 更新出发节点到index节点的距离* * @param index* @param len*/public void setLenFromBegin(int index, int len) {lenFromBegin[index] = len;}/*** 功能: 更新pre这个节点的前驱节点为index节点* * @param pre* @param index*/public void setPreNode(int pre, int index) {preNode[pre] = index;}/*** 功能:返回出发节点到index节点的距离* * @param index*/public int getLenFromBegin(int index) {return lenFromBegin[index];}/*** 寻找一个新的距离最短的访问节点。这个节点的要求是:未访问过,并且从已访问节点到此点是最短路径。* * @return 新的访问节点*/public int findNextNode() {int min = 65535, index = 0;for (int i = 0; i < visitedFlag.length; i++) {// 从所有节点中寻找if (visitedFlag[i] == 0 && lenFromBegin[i] < min) {// 未访问过,并且从已访问节点到此点是最短路径min = lenFromBegin[i];index = i;}}// 更新 index 节点被访问过visitedFlag[index] = 1;return index;}// 显示最后的结果,即:输出三个数组public void show() {System.out.println("==========================");// 输出already_arrfor (int i : visitedFlag) {System.out.print(i + " ");}System.out.println();// 输出pre_visitedfor (int i : preNode) {System.out.print(i + " ");}System.out.println();// 输出disfor (int i : lenFromBegin) {System.out.print(i + " ");}System.out.println();// 为了好看最后的最短距离,我们处理char[] vertex = { 'A', 'B', 'C', 'D', 'E', 'F', 'G' };int count = 0;for (int i : lenFromBegin) {if (i != 65535) {System.out.print(vertex[count] + "(" + i + ") ");} else {System.out.println("N ");}count++;}System.out.println();}
}

【算法设计与分析】Dijskra算法代码:Java版相关推荐

  1. 程振波 算法设计与分析_算法设计与分析

    本书按照教育部*制定的计算机科学与技术专业规范的教学大纲编写,努力与国际计算机学科的教学要求接轨.强调 算法 与 数据结构 之间密不可分的联系,因而强调融数据类型与定义在该类型上的运算于一体的抽象数据 ...

  2. 算法设计与分析——蒙特卡罗算法(简单、通俗、易懂)C++

    算法设计与分析--蒙特卡罗算法(简单.通俗.易懂) 虽然都是文字描述,但都是较为通俗的语言,相信你看完应该能理解 在实际应用中会遇到一些问题,不论采用确定性算法还是随机性算法,都无法保证每次能到到正确 ...

  3. 计算机算法设计与分析读后感,算法设计与分析基础经典读后感有感

    <算法设计与分析基础>是一本由Anany levitin著作,清华大学出版社出版的胶版纸图书,本书定价:49.00元,页数:409,特精心从网络上整理的一些读者的读后感,希望对大家能有帮助 ...

  4. 计算机算法设计与分析教学大纲,算法设计与分析的教与学(教学大纲)

    原标题:算法设计与分析的教与学(教学大纲) 课程代码:**** 课程负责人: **** 课程中文名称:算法设计与分析 课程英文名称:Designand Analysis of Algorithms 课 ...

  5. 《算法设计与分析》期末复习精简版

    期末考试形式全为大题,重点在于概念的掌握和方法的描述,所以再根据考点进行比较概念层面的复习 第一章 1.算法具有四个属性: 有输入,有输出,确定性,有穷性 第二章 一.分治法 > 分治法的设计思 ...

  6. 算法设计与分析 ——插入排序算法与归并排序算法比较

    插入排序算法与归并排序算法比较 实验目的 通过插入排序算法与归并排序算法效率对比体会算法在求解问题中的重要性. 实验内容 分别编写函数实现插入排序算法和归并排序算法: 利用随机函数产生大量数据存入数组 ...

  7. python 算法设计与分析_算法设计与分析(黄建军)

    spContent=本课基于主讲教师在北京大学讲授数据结构与算法课(Python版)的多年教学实践经验,面向具有Python语言程序设计基础的大学生和社会公众,介绍常见的基本数据结构以及相关经典算法, ...

  8. 算法设计与分析python_Python算法设计与分析

    内容提要 本书内容包括算法初步.排序算法.查找.双指针问题.哈希算法.深度优先搜索算法.广度优先搜索算法.回溯算法.动态规划.贪心算法.分治算法.并查集.最短路径算法和数论算法等常见算法.每个算法都做 ...

  9. 算法设计与分析_算法设计与分析(第2版)第2章分治策略回顾

    YI时间|外刊|MM-DFW|机器学习系列 点击上方蓝字,关注给你写干货的松子茶 分治策略是通用算法设计技术之一,很多有效的算法是它的特殊实现,顾名思义就是分而治之.一个问题能够用分治法求解的要素是 ...

  10. 算法设计与分析_算法导论(CLRS)骨灰级笔记分享:目录

    倘若你去问一个木匠学徒:你需要什么样的工具进行工作,他可能会回答你:"我只要一把锤子和一个锯".但是如果你去问一个老木工或者是大师级的建筑师,他会告诉你"我需要一些精确的 ...

最新文章

  1. DICOM:适用范围
  2. 想本科入读人工智能专业,这篇文章送给准备填志愿的你
  3. foreach和volist的区别
  4. 群晖NAS详细教程 DSM6.1.7版本(亲测有效)传统BIOS
  5. springboot+vue网络课程教学网站系统java源码介绍
  6. 微信APP支付配置文档
  7. shell批量修改后缀_用shell脚本批量修改文件后缀名
  8. 网络安全学习第14篇 - 游戏(仙剑奇侠传95)外挂之修改游戏资源文件(修改人物属性)
  9. 【CS61A】学习笔记
  10. Python奇技淫巧之Pycharm活动模板配置
  11. oracle的系统字符集,Oracle操作系统和支持-字符集
  12. 知网爬虫——爬取某个主题下的文章标题以及发表时间
  13. 初识顶点/片元着色器
  14. WebRTC 实现P2P音视频通话——搭建信令服务器
  15. 浙大计算机学院博士后几年出站,浙江大学博士后出站报告.pdf
  16. 清除浮动最有效的css写法,清除浮动最有效的css写法
  17. 白话数字签名(3)——Web程序中的数字签名 1
  18. IDEA 使用Git回滚到上一个版本
  19. Unity3D-VR《静夜诗》4-窗户门动画的播放
  20. 从世界五百强及中国五百强企业网站设计风格看当前WEB设计潮流

热门文章

  1. opencv4 python 版本_Opencv4 with Python3.6
  2. cmos逻辑门传输延迟时间_CMOS和TTL都有哪些区别?图腾柱电路又是什么,详情进来一瞧!...
  3. TensorFlow2-循环神经网络
  4. 数据分析实战-PUBG数据集EDA
  5. 【数据结构】线性表的链式存储-双链表
  6. 17.IDA-基本块的定义
  7. 3_2 TemplateMethodMode 模板方法模式
  8. cocos2d-x游戏开发(十)执行单元场景CCScene
  9. dnf辅助外挂C++源代码
  10. 白话科普,10s 了解 API