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. 算法的原理 以源点开始,以源点相连的顶点作为向外延伸的顶点,在所有这些向外延伸的顶 ...
随机推荐
- Xamarin Android 监听音量键(下)
上篇在 MainActivity 中重写了按键事件(OnKeyDown),获取了音量键键值并打印了出来,当然,手机物理按键和虚拟按键(音量键.返回键.菜单键等)均可通过该按键事件被捕获. 但是,按键重 ...
- Layui多文件上传进度条
Layui原生upload模块不支持文件上传进度条显示,百度,谷歌找了一下不太适用.后面找到一个别人修改好的JS,替换上去,修改一下页面显示即可使用,一下是部分代码 HTML: <div cla ...
- jvisualvm/Jconsole监控WAS中间件
1.登录was控制台https://196.168.119.18:9043/ibm/console/,找到自己的应用程序服务器---java和进程管理---进程定义--JAVA虚拟机,然后配置 通用J ...
- Java开发包Jedis
Jedis: http://www.oschina.net/p/jedis (Redis的官方首选Java开发包) <!--Redis --> <dependency> < ...
- Java虚拟机日志与参数
虚拟机日志 打印GC日志可以使用参数-XX:+PrintGC /** * -Xmx10m -Xms10m -XX:PretenureSizeThreshold=10485760 * -XX:+Prin ...
- T-SQL基础语句
存储过程允许标准组件式编程(模块化设计) 存储过程能够实现快速的执行速度 存储过程能够减少网络流量 存储过程可被作为一种安全机制充分利用 在SQL Server 的系列版本中存储过程分为两类:系统提供 ...
- 如何用python进行邮件发送
使用Python调用邮件服务器发送邮件,使用的协议是SMTP(Simple Mail Transfer Protocol),下图为使用TCP/IP基于SMTP发送邮件的过程示意图: SMTP协议工作原 ...
- java 正则 替换中文为空
//中文替换为"" public String replaceChineseToNULL(String s){ String reg = "[\u4e00-\u9fa5] ...
- mac下面有epoll?
没有的,但是mac下面有kqueue,跟epoll原理是差不多的. 这个是没办法的,如果实在需要,就用Ubuntu吧,这个也可以无缝迁移. 更多资源,更多文章由小白技术社提供(是我啦)
- Leetcode之二分法专题-852. 山脉数组的峰顶索引(Peak Index in a Mountain Array)
Leetcode之二分法专题-852. 山脉数组的峰顶索引(Peak Index in a Mountain Array) 我们把符合下列属性的数组 A 称作山脉: A.length >= 3 ...