Dijkstra算法的Java实现
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实现的更多相关文章
- Dijkstra算法之 Java详解
转载:http://www.cnblogs.com/skywang12345/ 迪杰斯特拉算法介绍 迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径. 它的主 ...
- 最短路径算法之Dijkstra算法(java实现)
前言 Dijkstra算法是最短路径算法中为人熟知的一种,是单起点全路径算法.该算法被称为是“贪心算法”的成功典范.本文接下来将尝试以最通俗的语言来介绍这个伟大的算法,并赋予java实现代码. 一.知 ...
- Dijkstra算法求最短路径(java)(转)
原文链接:Dijkstra算法求最短路径(java) 任务描述:在一个无向图中,获取起始节点到所有其他节点的最短路径描述 Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到 ...
- Java用Dijkstra算法实现地图两点的最短路径查询(Android版)
地图上实现最短路径的查询,据我了解的,一般用Dijkstra算法和A*算法来实现.由于这是一个课程项目,时间比较急,而且自己不熟悉A*算法,所以参考网上的Dijkstra算法(http://blog. ...
- 算法笔记_068:Dijkstra算法简单介绍(Java)
目录 1 问题描述 2 解决方案 2.1 使用Dijkstra算法得到最短距离示例 2.2 具体编码 1 问题描述 何为Dijkstra算法? Dijkstra算法功能:给出加权连通图中一个顶点, ...
- Dijkstra算法(一)之 C语言详解
本章介绍迪杰斯特拉算法.和以往一样,本文会先对迪杰斯特拉算法的理论论知识进行介绍,然后给出C语言的实现.后续再分别给出C++和Java版本的实现. 目录 1. 迪杰斯特拉算法介绍 2. 迪杰斯特拉算法 ...
- 最短路径算法-Dijkstra算法的应用之单词转换(词梯问题)(转)
一,问题描述 在英文单词表中,有一些单词非常相似,它们可以通过只变换一个字符而得到另一个单词.比如:hive-->five:wine-->line:line-->nine:nine- ...
- HDU 1874 畅通工程续(初涉dijkstra算法实现)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1874 dijkstra算法实现可参照此博客学习:http://www.cnblogs.com/biye ...
- 单源最短路径问题之dijkstra算法
欢迎探讨,如有错误敬请指正 如需转载,请注明出处 http://www.cnblogs.com/nullzx/ 1. 算法的原理 以源点开始,以源点相连的顶点作为向外延伸的顶点,在所有这些向外延伸的顶 ...
随机推荐
- 同时启动多个tomcat,端口修改
所用Tomcat服务器都为zip 版,非安装版.以 tomcat8 为例: 安装第二个Tomcat完成后,打开 tomcat/conf/server.xml 文件,查找以下三处: 1. 修改http访 ...
- Leetcode的SQL题解:185. 部门工资前三高的员工
题目 查询部门工资前三高的员工. 我用的数据库是oracle. 下面是数据表的信息. Employee表数据: | ID | NAME | Salary | DepartmentId | | -- | ...
- CSS3: @font-face 介绍与使用
@font-face 是CSS3中的一个模块,他主要是把自己定义的Web字体嵌入到你的网页中,随着@font-face模块的出现,我们在Web的开发中使用字体不怕只能使用Web安全字体,你们当中或许有 ...
- 深度学习模型训练技巧 Tips for Deep Learning
一.深度学习建模与调试流程 先看训练集上的结果怎么样(有些机器学习模型没必要这么做,比如决策树.KNN.Adaboost 啥的,理论上在训练集上一定能做到完全正确,没啥好检查的) Deep Learn ...
- 章节十五、7- 配置文件-Console Logging
一.创建xml文件 1.创建xml文件 在项目中我们需要专门建一个文件夹来放xml文件或者是其它文件. 2.然后对文件夹进行命名 3.选择new 其它 4.选择XML File 5.给xml文件命名 ...
- 第一次Git使用以及码云(Gitee)
下载安装Git,官网下载地址https://git-scm.com/downloads,我用的是Win10版,下载好后一路默认安装,安装时会给你自动添加环境变量,完成后打开cmd,输入git --ve ...
- Spring boot中的 JsonConverter
上图是spring-web包的部分目录 为了找出调用了哪种类型的Convert 我找到父类 HttpMessageConverter 查看了它的引用 在spring-boot-autoconfigur ...
- centos7 环境下安装nginx--Linux
一.安装前需要的编译环境准备 1.安装make yum install -y gcc automake autoconf libtool make 2.安装gcc.gcc-c++ yum instal ...
- 教你用原生CSS写炫酷页面切换效果,跟第三方组件说拜拜
因为项目需要,别人想让我给他写一个个人博客,并且给了我一个其他人的网页,可以点此查看.有的同学可能说了,第三方博客框架这么多,为什么还要去手写的,你说这个有可能是没有看到打开这个博客. 样式介绍 给大 ...
- win7 部署tomcat
1,下载 jdk:http://www.oracle.com/technetwork/java/javase/downloads/jdk-7u3-download-1501626.html 2,下载t ...