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. 算法的原理 以源点开始,以源点相连的顶点作为向外延伸的顶点,在所有这些向外延伸的顶 ...
随机推荐
- C#连接SQL Anywhere 12 数据库
using System;using System.Data.Common; namespace ConsoleApplication27{ class Program { ...
- .lib .dll 区别介绍、使用(dll的两种引入方式)
.lib .dll文件都是程序可直接引用的文件,前者就是所谓的库文件,后者是动态链接库(Dynamic Link Library)也是一个库文件.而.pdb则可以理解为符号表文件.DLL(Dynami ...
- coursera课程《how to learning 怎么学习》 总结
总体来说,学完课程没有茅舍顿开的感觉,而是更加印证了之前的那个认知:大道至简,践则无敌,很多的学习方法上学的时候老师都教过我们,关键是我们能否坚持执行.课程讲了很多脑科学有关学习的知识,但对于我们实践 ...
- HashMap这些问题你知道吗?
HashMap是Java面试中的常考点之一,而且其<Key,Value>结构也是开发中常常用到的结构之一.或许你使用过HashMap,但是你知道下面这些问题吗? HashMap的底层结构是 ...
- 弃用 wget, 拥抱多线程下载 axel
0x00 事件 对于在 Linux 的下载工具而言,比较常用的就是 wget 或者 curl,吾也一直用 wget 的方式进行网络上的资源下载.偶然发现了 axel 这个支持多线程的下载工具,试用了几 ...
- 简述关于ASP.NET MVC与.NET CORE 的区别
简述关于ASP.NET MVC与.NET CORE的区别1.关于ASP.NET 关于MVC刚开始接触这个技术的时候我经常不理解他们的名字,我相信许多学ASP.NET开发人员开始接触MVC应该也和我一样 ...
- nodeCZBK-笔记2
目录 day04 mongoDB数据库使用 day05 node使用mongoDB数据库 day04 mongoDB数据库使用 电脑全局安装数据库 开机命令:mongod --dbpath c:\mo ...
- keras的get_value运行越来越慢的问题解决
https://blog.csdn.net/mingshili/article/details/81941677?utm_source=blogxgwz5
- Keras实例教程(1)
https://blog.csdn.net/baimafujinji/article/details/78384792
- 百度地图Canvas实现十万CAD数据秒级加载
背景 前段时间工作室接到一个与地图相关的项目,我作为项目组成员主要负责地图方面的设计和开发.由于地图部分主要涉及的是前端页面的显示,作为一名Java后端的小白,第一次写了这么多HTML和JavaScr ...