dijkstra java pre_Dijkstra算法实现
fun main() {
var mapGraph = MapGraph(6)
mapGraph.addEdge(0, 1, 5)
mapGraph.addEdge(0, 5, 8)
mapGraph.addEdge(1, 4, 2)
mapGraph.addEdge(1, 2, 8)
mapGraph.addEdge(2, 3, 2)
mapGraph.addEdge(3, 5, 1)
mapGraph.addEdge(4, 3, 3)
mapGraph.dijkstra(0, 5)
}
/**
* @param sid 起始顶点
* @param tid 终止顶点
* @param weight 权重
*/
class Edge(var sid: Int, var tid: Int, var weight: Int)
/**
* @param sid 顶点编号
* @param dist 从起始顶点到该顶点的距离
*/
class Vertex(var sid: Int, var dist: Int)
class MapGraph(val size: Int) {
private var adj = Array(size) {
java.util.LinkedList()
}
fun addEdge(sid: Int, tid: Int, w: Int) {
var edge = Edge(sid, tid, w)
adj[sid].add(edge)
}
fun dijkstra(s: Int, t: Int) {
//用来还原最短路径
var predecessor = Array(size){ -1 }
var vertexes = Array(size) {
Vertex(it, Int.MAX_VALUE)
}
//小顶堆
var queue = PriorityQueue(size)
var inqueue = Array(size) { false }
vertexes[s].dist = 0
queue.add(vertexes[s])
inqueue[s] = true
while (!queue.isEmpty()) {
//取出堆顶
var minVertex: Vertex = queue.poll()!!
//最短路径产生
if (minVertex.sid == t) {
break
}
for (i in adj[minVertex.sid].indices) {
//取出一条 minVertex 相连的边
var edge = adj[minVertex.sid][i]
// minVertex -> nextVertex
var nextVertex = vertexes[edge.tid]
if (minVertex.dist + edge.weight < nextVertex.dist) {
nextVertex.dist = minVertex.dist + edge.weight
predecessor[nextVertex.sid] = minVertex.sid
if (inqueue[nextVertex.sid]) {
queue.update(nextVertex)
} else {
queue.add(nextVertex)
inqueue[nextVertex.sid] = true
}
}
}
}
printPath(s, t, predecessor)
}
private fun printPath(s: Int, t: Int, predecessor: Array) {
if (s == t) {
print("$s")
return
}
var pre = predecessor[t]
if (pre < 0) {
return
}
printPath(s, pre, predecessor)
print("->${t}")
}
}
class PriorityQueue(val size: Int) {
private val nodes: Array = Array(size) {
null
}
private var realCount = 0
fun poll(): Vertex? {
if (realCount == 0) {
return null
}
var item = nodes[0]
nodes[0] = nodes[realCount - 1]
nodes[realCount - 1] = null
realCount--
//自上而下进行堆化
heapifyUpToDown(0)
return item
}
fun add(vertex: Vertex): Boolean {
if (realCount == size) {
return false
}
nodes[realCount++] = vertex
//自下而上进行堆化
heapifyDownToUp(realCount - 1)
return true
}
fun update(vertex: Vertex): Boolean {
for (i in 0 until realCount) {
if (nodes[i]!!.sid == vertex.sid) {
nodes[i]!!.dist = vertex.dist
var p = i
while (p >= 0) {
var up = (p - 1) / 2
heapifyUpToDown(p)
if (up >= 0 && nodes[up]!!.dist <= nodes[p]!!.dist) {
break
}
p = up
}
return true
}
}
return false
}
fun isEmpty(): Boolean = realCount == 0
fun heapifyUpToDown(i: Int) {
var p = i
while (p < realCount) {
var minPos = p
var left = p * 2 + 1
var right = left + 1
if (left < realCount && nodes[left]!!.dist < nodes[minPos]!!.dist) {
minPos = left
}
if (right < realCount && nodes[right]!!.dist < nodes[minPos]!!.dist) {
minPos = right
}
if (p == minPos) {
break
}
swap(p, minPos)
p = minPos
}
}
fun heapifyDownToUp(i: Int) {
var p = i
while (p > 0) {
var up = (p - 1) / 2
if (nodes[p]!!.dist < nodes[up]!!.dist) {
swap(p, up)
p = up
} else {
break
}
}
}
fun swap(i: Int, j: Int) {
var tmp = nodes[i]
nodes[i] = nodes[j]
nodes[j] = tmp
}
}
dijkstra java pre_Dijkstra算法实现相关推荐
- Dijkstra最短路由算法,求任意两点之间的最短距离【Java】
一.问题 求下图中节点0到节点5之间的最短距离 二.方法 Dijkstra最短路由算法.本文不再赘述,直接上代码,如果不懂,可以参考 文章 三.代码 public class MyDijkstra { ...
- JAVA经典算法大全
JAVA经典算法大全 from http://java-mans.iteye.com/blog/16457031.河内之塔 2.Algorithm Gossip: 费式数列. 3.巴斯卡三角形 4.A ...
- Java刷算法:收藏大法
Java刷算法怎么刷:持续更新中 算法技巧 算法一轮复习 Java API复习 输入与输出 java.io.* java.util.* 数组 **判断二维数组是否为空** **数组拷贝** **字符数 ...
- Java排序算法:冒泡排序
Java排序算法:冒泡排序 //创建数组并赋值int[] data = new int[] {11,10,55,78,100,111,45,56,79,90,345,1000};for(int i=0 ...
- java python算法_用Python,Java和C ++示例解释的排序算法
java python算法 什么是排序算法? (What is a Sorting Algorithm?) Sorting algorithms are a set of instructions t ...
- JAVA经典算法50题(转)
转载请注明出处:http://blog.csdn.net/l1028386804/article/details/51097928 JAVA经典算法50题 [程序1] 题目:古典问题:有一对兔子, ...
- java经典算法四十题
java经典算法四十题 [程序9]题目:一个数如果恰好等于它的因子之和,这个数就称为 "完数 ".例如6=1+2+3.编程找出1000以内的所有完数. public class W ...
- JVM(3):Java GC算法 垃圾收集器
概述 垃圾收集 Garbage Collection 通常被称为"GC",它诞生于1960年 MIT 的 Lisp 语言,经过半个多世纪,目前已经十分成熟了. jvm 中,程序计数 ...
- java序列化算法透析_Java序列化机制与原理的深入分析
Java序列化算法透析 Serialization(序列化)是一种将对象以一连串的字节描述的过程:反序列化deserialization是一种将这些字节重建成一个对象的过程.Java序列化API提供一 ...
最新文章
- antd 文本域超长问题_一款能快速批量处理SQL文本的软件:NimbleText
- java8中-_java8中的Stream
- 8 使用_【化学技能8】 酸式滴定管的使用
- Phpcms之核心目录phpcms
- 坑爹的水题之“元芳你怎么看”
- hadoop2.4.2集群搭建及hive与mysql集成文档记录
- dns服务期搭建使用_DNS添加反向查找区域
- Hibernate延迟加载策略
- Android入门笔记08
- matlab激光雷达三角测距,三角测距激光雷达原理
- 软件工作量评估方法(一)
- 【MySQL从入门到精通】【高级篇】(二十五)EXPLAIN中ref、rows、filtered、Extra字段的剖析
- 新店速递丨白玉兰(商务)酒店赣榆吾悦广场店 正式上线
- 中南计算机绘图试题,中南大学计算机绘图试题b答案
- SAP PS 第2节 项目状态及字段选择
- 量子态操作:基于门的三态旋转
- 微信小程序仿淘票票之登录注册讲解
- 2008年汽车电子的9大应用开发和改进亮点
- 易语言开发IE工具条 -- 另类篇
- mkv格式怎么无损转换成mp4?教你快速转换的方法
热门文章
- pg插入执行成功但是没有数据_pg_lightool基于basebackup的单表恢复和块恢复
- php中global什么意思,php中global与$GLOBAL的用法及区别(转载)
- linux下查看mysql数据库的字段类型_系统运维|[小白技巧]如何在Linux上检查MySQL数据表的存储引擎类型...
- java的gc策略_Java的GC与内存分配策略
- dos 操作mysql_dos命令操作数据库
- linux dd 清屏 of=/dev/mem,Linux系统简介分区基础命令(ADMIN01-2)(示例代码)
- c语言printf输出中文报错,printf输出中文后还带有数字是怎么回事?
- windows无法访问_注册CourseMaker之后无法登录,显示“网络无法访问……”,怎么办?...
- centos5.5安装ntfs-3g,并遇到mount failed: 设备或资源忙的解决方案
- object references an unsaved transient instance save the transient instance before flushing