package main.java;

 import main.java.utils.GraphUtil;

 import java.util.ArrayDeque;
import java.util.List;
import java.util.Queue; /**
* @Tme 2019/9/12 10:40
* @Author chenhaisheng
* @Email:ecjutsbs@foxmail.com
*/
public class DijkstraTest { //邻接矩阵的表示
public final static double[][] GRAPH_DISTANCE = GraphUtil.getDijkstraGraph(); //起点到某节点的临时最短距离
public static double distance[] = new double[GRAPH_DISTANCE.length]; //某节点的前驱节点
public static int pre[] = new int[GRAPH_DISTANCE.length]; static int originIndex = 0, toIndex = 4; public static void main(String[] args) { init();
findDijkstraShortestPath();
} /*
**初始化distance[] pre[]
*/
public static void init() { for (int i = 0; i < distance.length; i++) {
if (i == originIndex) {
distance[i] = 0.0;
continue;
}
distance[i] = Double.MAX_VALUE;
} for (int i = 0; i < pre.length; i++) {
pre[i] = -1;
}
} public static void findDijkstraShortestPath() { //queue用于保存尚待搜索的节点
Queue<Integer> queue = new ArrayDeque<>(); //起始,将起始节点添加到queue
queue.add(originIndex); while (queue.size() != 0) { Integer currentIndex = queue.poll(); //获取当前节点的out-edges
List<Integer> neighbours = getNeighbours(currentIndex); for (int i = 0; i < neighbours.size(); i++) { //获取邻居节点的索引值
int neighbourIndex = neighbours.get(i); //若起点经当前节点到邻居节点的距离 比直接到邻居节点的距离还小
if (distance[currentIndex] + getDistance(currentIndex, neighbourIndex) < distance[neighbourIndex]) { //更新起点到邻居节点的距离
distance[neighbourIndex] = distance[currentIndex] + getDistance(currentIndex, neighbourIndex); //设置下一个节点的前驱节点为当前节点
pre[neighbourIndex] = currentIndex; //由于distance[neighbourIndex]已经改变,因此需要重新搜索neighbourIndex
queue.add(neighbourIndex);
}
}
} //输出从originIndex到toIndex的路径
printPath(pre, originIndex, toIndex);
} public static void printPath(int pre[], int from, int to) { //栈
Deque<Integer> path = new ArrayDeque<>(); path.push(to); int preIndex = pre[to];
while (preIndex != from) {
path.push(preIndex);
preIndex = pre[preIndex];
} path.push(from); while (!path.isEmpty()) {
System.out.print(path.poll() + (path.size() > 0 ? "------>" : " "));
}
System.out.println(" ");
} //获取当前节点所有的out-edges
public static List getNeighbours(int index) { List<Integer> res = new ArrayList(); //距离不为Double.MAX_VALUE,代表与当前节点连通
for (int i = 0; i < GRAPH_DISTANCE[index].length; i++) {
if (GRAPH_DISTANCE[index][i] != Double.MAX_VALUE)
res.add(i);
}
return res;
} public static double getDistance(int from, int to) {
return GRAPH_DISTANCE[from][to];
}
}
 package main.java.utils;

 /**
* @Tme ${DATA} 19:10
* @Author chenhaisheng
* @Email:ecjutsbs@foxmail.com
*/
public class GraphUtil<T> { public static double[][] getDijkstraGraph(){
double max=Double.MAX_VALUE;
double[][] graph={
{max,5,max,7,15},
{max,max,5,max,max},
{max,max,max,max,1},
{max,max,2,max,max},
{max,max,max,max,max}
};
return graph;
}
}

对应的图:

图的结构Ref:https://wenku.baidu.com/view/9fdeaa3c2b160b4e767fcff7.html

小结:

最重要的是记住:在搜索过程中,若节点i对应的distance[i]发生改变,那么对其任意一个邻居节点j,对应的distance[j]都要重新计算,继而引发连锁反应。

对某一个节点k,distance[k]通常会发生会多次改变。

Dijkstra算法的Java实现的更多相关文章

  1. Dijkstra算法之 Java详解

    转载:http://www.cnblogs.com/skywang12345/ 迪杰斯特拉算法介绍 迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径. 它的主 ...

  2. 最短路径算法之Dijkstra算法(java实现)

    前言 Dijkstra算法是最短路径算法中为人熟知的一种,是单起点全路径算法.该算法被称为是“贪心算法”的成功典范.本文接下来将尝试以最通俗的语言来介绍这个伟大的算法,并赋予java实现代码. 一.知 ...

  3. Dijkstra算法求最短路径(java)(转)

    原文链接:Dijkstra算法求最短路径(java) 任务描述:在一个无向图中,获取起始节点到所有其他节点的最短路径描述 Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到 ...

  4. Java用Dijkstra算法实现地图两点的最短路径查询(Android版)

    地图上实现最短路径的查询,据我了解的,一般用Dijkstra算法和A*算法来实现.由于这是一个课程项目,时间比较急,而且自己不熟悉A*算法,所以参考网上的Dijkstra算法(http://blog. ...

  5. 算法笔记_068:Dijkstra算法简单介绍(Java)

    目录 1 问题描述 2 解决方案 2.1 使用Dijkstra算法得到最短距离示例 2.2 具体编码   1 问题描述 何为Dijkstra算法? Dijkstra算法功能:给出加权连通图中一个顶点, ...

  6. Dijkstra算法(一)之 C语言详解

    本章介绍迪杰斯特拉算法.和以往一样,本文会先对迪杰斯特拉算法的理论论知识进行介绍,然后给出C语言的实现.后续再分别给出C++和Java版本的实现. 目录 1. 迪杰斯特拉算法介绍 2. 迪杰斯特拉算法 ...

  7. 最短路径算法-Dijkstra算法的应用之单词转换(词梯问题)(转)

    一,问题描述 在英文单词表中,有一些单词非常相似,它们可以通过只变换一个字符而得到另一个单词.比如:hive-->five:wine-->line:line-->nine:nine- ...

  8. HDU 1874 畅通工程续(初涉dijkstra算法实现)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1874 dijkstra算法实现可参照此博客学习:http://www.cnblogs.com/biye ...

  9. 单源最短路径问题之dijkstra算法

    欢迎探讨,如有错误敬请指正 如需转载,请注明出处 http://www.cnblogs.com/nullzx/ 1. 算法的原理 以源点开始,以源点相连的顶点作为向外延伸的顶点,在所有这些向外延伸的顶 ...

随机推荐

  1. 同时启动多个tomcat,端口修改

    所用Tomcat服务器都为zip 版,非安装版.以 tomcat8 为例: 安装第二个Tomcat完成后,打开 tomcat/conf/server.xml 文件,查找以下三处: 1. 修改http访 ...

  2. Leetcode的SQL题解:185. 部门工资前三高的员工

    题目 查询部门工资前三高的员工. 我用的数据库是oracle. 下面是数据表的信息. Employee表数据: | ID | NAME | Salary | DepartmentId | | -- | ...

  3. CSS3: @font-face 介绍与使用

    @font-face 是CSS3中的一个模块,他主要是把自己定义的Web字体嵌入到你的网页中,随着@font-face模块的出现,我们在Web的开发中使用字体不怕只能使用Web安全字体,你们当中或许有 ...

  4. 深度学习模型训练技巧 Tips for Deep Learning

    一.深度学习建模与调试流程 先看训练集上的结果怎么样(有些机器学习模型没必要这么做,比如决策树.KNN.Adaboost 啥的,理论上在训练集上一定能做到完全正确,没啥好检查的) Deep Learn ...

  5. 章节十五、7- 配置文件-Console Logging

    一.创建xml文件 1.创建xml文件 在项目中我们需要专门建一个文件夹来放xml文件或者是其它文件. 2.然后对文件夹进行命名 3.选择new  其它 4.选择XML File 5.给xml文件命名 ...

  6. 第一次Git使用以及码云(Gitee)

    下载安装Git,官网下载地址https://git-scm.com/downloads,我用的是Win10版,下载好后一路默认安装,安装时会给你自动添加环境变量,完成后打开cmd,输入git --ve ...

  7. Spring boot中的 JsonConverter

    上图是spring-web包的部分目录 为了找出调用了哪种类型的Convert 我找到父类 HttpMessageConverter 查看了它的引用 在spring-boot-autoconfigur ...

  8. centos7 环境下安装nginx--Linux

    一.安装前需要的编译环境准备 1.安装make yum install -y gcc automake autoconf libtool make 2.安装gcc.gcc-c++ yum instal ...

  9. 教你用原生CSS写炫酷页面切换效果,跟第三方组件说拜拜

    因为项目需要,别人想让我给他写一个个人博客,并且给了我一个其他人的网页,可以点此查看.有的同学可能说了,第三方博客框架这么多,为什么还要去手写的,你说这个有可能是没有看到打开这个博客. 样式介绍 给大 ...

  10. win7 部署tomcat

    1,下载 jdk:http://www.oracle.com/technetwork/java/javase/downloads/jdk-7u3-download-1501626.html 2,下载t ...