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算法实现相关推荐

  1. Dijkstra最短路由算法,求任意两点之间的最短距离【Java】

    一.问题 求下图中节点0到节点5之间的最短距离 二.方法 Dijkstra最短路由算法.本文不再赘述,直接上代码,如果不懂,可以参考 文章 三.代码 public class MyDijkstra { ...

  2. JAVA经典算法大全

    JAVA经典算法大全 from http://java-mans.iteye.com/blog/16457031.河内之塔 2.Algorithm Gossip: 费式数列. 3.巴斯卡三角形 4.A ...

  3. Java刷算法:收藏大法

    Java刷算法怎么刷:持续更新中 算法技巧 算法一轮复习 Java API复习 输入与输出 java.io.* java.util.* 数组 **判断二维数组是否为空** **数组拷贝** **字符数 ...

  4. Java排序算法:冒泡排序

    Java排序算法:冒泡排序 //创建数组并赋值int[] data = new int[] {11,10,55,78,100,111,45,56,79,90,345,1000};for(int i=0 ...

  5. java python算法_用Python,Java和C ++示例解释的排序算法

    java python算法 什么是排序算法? (What is a Sorting Algorithm?) Sorting algorithms are a set of instructions t ...

  6. JAVA经典算法50题(转)

    转载请注明出处:http://blog.csdn.net/l1028386804/article/details/51097928 JAVA经典算法50题 [程序1]   题目:古典问题:有一对兔子, ...

  7. java经典算法四十题

    java经典算法四十题 [程序9]题目:一个数如果恰好等于它的因子之和,这个数就称为 "完数 ".例如6=1+2+3.编程找出1000以内的所有完数. public class W ...

  8. JVM(3):Java GC算法 垃圾收集器

    概述 垃圾收集 Garbage Collection 通常被称为"GC",它诞生于1960年 MIT 的 Lisp 语言,经过半个多世纪,目前已经十分成熟了. jvm 中,程序计数 ...

  9. java序列化算法透析_Java序列化机制与原理的深入分析

    Java序列化算法透析 Serialization(序列化)是一种将对象以一连串的字节描述的过程:反序列化deserialization是一种将这些字节重建成一个对象的过程.Java序列化API提供一 ...

最新文章

  1. antd 文本域超长问题_一款能快速批量处理SQL文本的软件:NimbleText
  2. java8中-_java8中的Stream
  3. 8 使用_【化学技能8】 酸式滴定管的使用
  4. Phpcms之核心目录phpcms
  5. 坑爹的水题之“元芳你怎么看”
  6. hadoop2.4.2集群搭建及hive与mysql集成文档记录
  7. dns服务期搭建使用_DNS添加反向查找区域
  8. Hibernate延迟加载策略
  9. Android入门笔记08
  10. matlab激光雷达三角测距,三角测距激光雷达原理
  11. 软件工作量评估方法(一)
  12. 【MySQL从入门到精通】【高级篇】(二十五)EXPLAIN中ref、rows、filtered、Extra字段的剖析
  13. 新店速递丨白玉兰(商务)酒店赣榆吾悦广场店 正式上线
  14. 中南计算机绘图试题,中南大学计算机绘图试题b答案
  15. SAP PS 第2节 项目状态及字段选择
  16. 量子态操作:基于门的三态旋转
  17. 微信小程序仿淘票票之登录注册讲解
  18. 2008年汽车电子的9大应用开发和改进亮点
  19. 易语言开发IE工具条 -- 另类篇
  20. mkv格式怎么无损转换成mp4?教你快速转换的方法

热门文章

  1. pg插入执行成功但是没有数据_pg_lightool基于basebackup的单表恢复和块恢复
  2. php中global什么意思,php中global与$GLOBAL的用法及区别(转载)
  3. linux下查看mysql数据库的字段类型_系统运维|[小白技巧]如何在Linux上检查MySQL数据表的存储引擎类型...
  4. java的gc策略_Java的GC与内存分配策略
  5. dos 操作mysql_dos命令操作数据库
  6. linux dd 清屏 of=/dev/mem,Linux系统简介分区基础命令(ADMIN01-2)(示例代码)
  7. c语言printf输出中文报错,printf输出中文后还带有数字是怎么回事?
  8. windows无法访问_注册CourseMaker之后无法登录,显示“网络无法访问……”,怎么办?...
  9. centos5.5安装ntfs-3g,并遇到mount failed: 设备或资源忙的解决方案
  10. object references an unsaved transient instance save the transient instance before flushing