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. Lua语言学习

    1,语法 语句不用分号结尾 function ... end if .. else .. end 2, io库, string库, table库, OS库, 算术库, debug库 3, dofile ...

  2. 关于 java中的换行符

    java中实现换行有以下3种方法: 1.使用java中的转义符"\r\n": String str="aaa"; str+="\r\n"; ...

  3. 通过wireshark学习Traceroute命令和mtr(UDP,ICMP协议)

    traceroute: 通过TTL限定的ICMP/UDP/TCP侦测包来发现从本地主机到远端目标主机之间的第三层转发路径.用来调试网络连接性和路由问题. mtr: traceroute的一个变种,能根 ...

  4. oracle常规使用(一)

    目录 特殊sql distinct 项目中遇到表中无主键,但是某个字段不能重复. 需要匹配id串里的内容 批量更新,但是批量成功返回的是-1 时间格式化 行列互转 应用场景 列转行 总结 oracle ...

  5. Redis集群与spring的整合

    上一篇详细的赘述了Redis的curd操作及集群的搭建.下面我们开始将他整合到我们实际的项目中去.我的项目采用的是标准的ssm框架,ssm框架这里不说,直接开始整合. 首先在maven管理中将我们的j ...

  6. 关于Java虚拟机运行时数据区域的总结

    Java虚拟机运行时数据区域 程序计数器(Program Counter) 程序计数器作为一个概念模型,这个是用来指示下一条需要执行的字节码指令在哪. Java的多线程实际上是通过线程轮转做到的,如果 ...

  7. 洛谷 P3338 [ZJOI2014]力

    题意简述 读入\(n\)个数\(q_i\) 设\(F_j = \sum\limits_{i<j}\frac{q_i\times q_j}{(i-j)^2 }-\sum\limits_{i> ...

  8. Java网络编程与NIO详解4:浅析NIO包中的Buffer、Channel 和 Selector

    微信公众号[黄小斜]作者是蚂蚁金服 JAVA 工程师,目前在蚂蚁财富负责后端开发工作,专注于 JAVA 后端技术栈,同时也懂点投资理财,坚持学习和写作,用大厂程序员的视角解读技术与互联网,我的世界里不 ...

  9. 启xin宝app的token算法破解——逆向篇(二)

    启xin宝app的token算法破解--抓包分析篇(一)文章已经对该app进行了抓包分析,现在继续对它进行逆向. 对于一个app而言,我们要逆向app,需要知道什么呢? 逆向工具 Java基础,甚至c ...

  10. 单元测试之NUnit一

    NUnit 分三篇文章介绍,入门者可阅读文章,有基础者直接参考官方文档.初次写博客,望大家指点. 导航: 单元测试之NUnit一 单元测试之NUnit二 单元测试之NUnit三 NUnit是什么? N ...