迪克斯特拉(Dijkstra)算法:解决有权图中的最短路径(使用优先队列)问题;
  最短路径树(Shortest Path Tree):所有节点的最短路径(相对于初始节点)组成的树。

算法原理
  1.使用优先队列(PQ)按照(节点,距离)的方式存储(优先跟踪距离较小的节点);
  2.初始化edgeTo和disTo数组,初始化PQ;
  3.取出优先队列的第一个节点V,访问V已经被marked的邻接节点(disTo不为初始值),更新V的disTo和edgeTo信息;访问V未被marked的邻接节点W,更新W到source节点的距离(更新disTo数组),更新edgeTo,将W存入PQ。
  4.重复步骤3直至PQ为空。

java代码
  使用如下所示的有权图作为示例

  Dijkstra.java
import java.util.*;public class Dijkstra {private PriorityQueue<Pair> priQueue;private int[] edgeTo; // 存储最短路径树中邻接的前一顶点private int[] disTo;  // 存储当前节点到source顶点的距离private int MAX_VALUE = Integer.MAX_VALUE;private class Pair {/* 存储顶点index和与source之间的最短距离信息*/private int v;private int dis;Pair(int v, int dis) {this.v = v;this.dis = dis;}}private class selfComparator implements Comparator<Pair> {/* 自定义PQ中的Comparator*/@Overridepublic int compare(Pair o1, Pair o2) {if (o1.dis < o2.dis) {return -1;} else if (o1.dis > o2.dis) {return 1;}return 0;}}Dijkstra(Graph testGraph, int sourceIdx) {init(testGraph.V(), sourceIdx);  // 初始化edgeTo、disTO和PQ;while (priQueue.size() != 0) {Pair cur = priQueue.remove();visitAdjMarked(cur.v, testGraph);visitAdjUnMarked(cur.v, testGraph);}}private void init(int size, int s) {/* PQ初始存储source节点;edgeTo除source外设置为-1;disTo除source外设置为MAX_VALUE;*/this.priQueue = new PriorityQueue<>(size, new selfComparator());this.edgeTo = new int[size];Arrays.fill(edgeTo, -1);edgeTo[s] = s;this.disTo = new int[size];Arrays.fill(disTo, MAX_VALUE);disTo[s] = 0;Pair cur = new Pair(s, disTo[s]);priQueue.add(cur);}private void visitAdjMarked(int idx, Graph graph) {/* 访问idx被visit过的邻接顶点*/for (int adj : graph.adj(idx)) {int newDis = disTo[adj] + graph.disTO(idx, adj);if (disTo[adj] != MAX_VALUE && newDis < disTo[idx]) {disTo[idx] = newDis;edgeTo[idx] = adj;}}}private void visitAdjUnMarked(int idx, Graph graph) {/* 访问idx未被visit的邻接顶点*/for (int adj : graph.adj(idx)) {int newDis = disTo[idx] + graph.disTO(idx, adj);if (disTo[adj] == MAX_VALUE) {disTo[adj] = newDis;edgeTo[adj] = idx;Pair cur = new Pair(adj, newDis);priQueue.add(cur);}}}public static void main(String[] args) {Graph test = new Graph(7);   // 按照实例初始化graphtest.addEdge(0, 1, 2);test.addEdge(0, 2, 1);test.addEdge(1, 2, 5);test.addEdge(1, 3, 11);test.addEdge(1, 4, 3);test.addEdge(2, 4, 1);test.addEdge(2, 5, 15);test.addEdge(3, 4, 2);test.addEdge(4, 5, 4);test.addEdge(3, 6, 1);test.addEdge(4, 6, 5);test.addEdge(5, 6, 1);Dijkstra a = new Dijkstra(test, 0);List<Integer> route = new ArrayList<>();int t = 5;while (t != 0) {route.add(t);t = a.edgeTo[t];}System.out.print("到顶点5的最短路径为: 0");  // 验证最短路径是否正确for (int i = route.size() - 1; i >= 0; i--) {System.out.print(" ——> " + route.get(i));}}
}
  Graph.java
import java.util.ArrayList;
import java.util.List;public class Graph {private List<Pair>[] ver;private class Pair {private int v;private int weight;Pair(int v, int weight) {this.v = v;this.weight = weight;}public int getV() {return v;}public int getWeight() {return weight;}}Graph(int v) {/* Create empty graph with v vertices*/ver = new List[v];}public void addEdge(int v, int w, int n) {/* add an edge v-w with weight n*/if (ver[v] == null) {ver[v] = new ArrayList<>();}if (ver[w] == null) {ver[w] = new ArrayList<>();}Pair pairV = new Pair(v, n);Pair pairW = new Pair(w, n);ver[v].add(pairW);ver[w].add(pairV);}Iterable<Integer> adj(int v) {/* vertices adjacent to v*/List<Integer> res = new ArrayList<>();for (Pair p : ver[v]) {res.add(p.getV());}return res;}public int V() {/* number of vertices*/return ver.length;}public int E() {/* number of edges*/int res = 0;for (int i = 0; i < ver.length; i++) {res += ver[i].size();}return res / 2;}public int disTO(int v, int w) {/* the weight between v-w*/int res = 0;for (Pair p : ver[v]) {if (p.getV() == w) {res = p.getWeight();}}return res;}public static void main(String[] args) {Graph test = new Graph(7);test.addEdge(0, 1, 2);test.addEdge(0, 2, 1);test.addEdge(1, 2, 5);test.addEdge(1, 3, 11);test.addEdge(1, 4, 3);test.addEdge(2, 4, 1);test.addEdge(2, 5, 15);test.addEdge(3, 4, 2);test.addEdge(4, 5, 4);test.addEdge(3, 6, 1);test.addEdge(4, 6, 5);test.addEdge(5, 6, 1);for (int i = 0; i < test.V(); i++) {System.out.println("和" + i + "邻接的顶点为:" + test.adj(i));}System.out.println("顶点的数量:" + test.V());   // 顶点的数量应该为5System.out.println("边的的数量:" + test.E());   // 边的数量应该为6}
}

To be a sailor of the world bound for all ports.

迪克斯特拉(Dijkstra)算法原理及实现(Java)相关推荐

  1. 最短路径之迪克斯特拉(Dijkstra)算法

    何谓最短路径 顾名思义就是在一个图中,一个顶点到另外一个顶点的最短距离拉.那么这里有一点要注意,就是在网图中(边的权值各不相同)最短路径指的是俩点之间的连线权值最小:在非网图(边的权值都默认为1)中最 ...

  2. Java迪杰斯特拉(Dijkstra)算法与弗洛伊德(Floyd)算法

    1.Java迪杰斯特拉(Dijkstra)算法与弗洛伊德(Floyd)算法 1.1 迪杰斯特拉(Dijkstra)算法 1.1.1 迪杰斯特拉(Dijkstra)算法介绍 迪杰斯特拉(Dijkstra ...

  3. 059.迪杰斯特拉(Dijkstra)算法的原理以及解决最短路径问题

    1. 迪杰斯特拉(Dijkstra)算法的原理 1.1. 算法应用场景-最短路径问题 1.2. 基本介绍 1.3. 步骤详解 1.4. 思路解析 1.5. 图解步骤 2. 迪杰斯特拉(Dijkstra ...

  4. 简述dijkstra算法原理_理解最短路径——迪杰斯特拉(dijkstra)算法

    1.       迪杰斯特拉算法简介 迪杰斯特拉(dijkstra)算法是典型的用来解决最短路径的算法,也是很多教程中的范例,由荷兰计算机科学家狄克斯特拉于1959年提出,用来求得从起始点到其他所有点 ...

  5. java数据结构和算法——迪杰斯特拉(Dijkstra)算法

    目录 一.迪杰斯特拉(Dijkstra)算法介绍 二.迪杰斯特拉(Dijkstra)算法过程 三.迪杰斯特拉(Dijkstra)算法--应用场景(最短路径问题) 四.迪杰斯特拉(Dijkstra)算法 ...

  6. java实现迪杰斯特拉(Dijkstra)算法求解最短路问题

    迪杰斯特拉(Dijkstra)算法是由荷兰计算机科学家狄克斯特拉于1959年提出的.是寻找从一个顶点到其余各顶点的最短路径算法,可用来解决最短路径问题. 迪杰斯特拉算法采用贪心算法的策略,将所有顶点分 ...

  7. 简述dijkstra算法原理_Dijkstra算法之 Java详解

    迪杰斯特拉算法介绍 迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径. 它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止. 基 ...

  8. 数据结构与算法(7-4)最短路径(迪杰斯特拉(Dijkstra)算法、弗洛伊德(Floyd)算法)

    目录 一.最短路径概念 二.迪杰斯特拉(Dijkstra)算法(单源最短路径) 1.原理 2.过程 3.代码 三.弗洛伊德(Floyd)算法(多源最短路径) 1.原理 2.存储 3.遍历 4.代码 参 ...

  9. 迪杰斯特拉(Dijkstra)算法解决最短路径问题

    Dijkstra 算法介绍 迪杰斯特拉算法(Dijkstra)是由荷兰计算机科学家狄克斯特拉于1959年提出的,因此又叫狄克斯特拉算法.迪杰斯特拉(Dijkstra)算法是最经典的最短路径算法之一,用 ...

  10. java排序算法原理_排序算法原理与实现(java)

    排序算法原理与实现(java) Java程序员必知的8大排序 [来源:本站 | 日期:2012年12月24日 | 浏览173 次] 字体:[大 中 小] 8种排序之间的关系: 1, 直接插入排序 (1 ...

最新文章

  1. 程序员学霸!top2大学毕业!不到30岁第一次升P9失败!挫折感极强,怀疑人生?网友:没升P7的我,不要面子的吗??...
  2. python_面向对象进阶之元类
  3. 公共关系计算机操作题,2012年计算机二级Access考前模拟题及答案(8)
  4. 百万数据报表:分析以及解决办法
  5. resolv.conf
  6. ORA-12899: value too large for column (actual: 27, maximum: 20)错误解决
  7. 【疑问感受】初见指针——当函数遇到指针
  8. netscreen 25配置外网到内网的Webserver实践
  9. 华为手机连接电脑用什么软件_屏幕镜像怎么连接电脑?使用这款软件,轻松投屏苹果手机到电脑...
  10. mysql私房菜_老男孩MySQL私房菜深入浅出精品视频第7章备份与恢复基础实践视频课程...
  11. [ios2] UIView的hitTest,pointInside方法详解【转】
  12. Java 技巧篇-IntelliJ IDEA快捷键设置,格式化代码快捷键
  13. 域名排名(前100万)
  14. Could not start Tomcat
  15. ImportError: CuPy is not correctly installed解决方法
  16. html 页面文字不能复制粘贴,网页文字无法复制粘贴 复制粘贴不能用
  17. Chapter 1 (Linear Equations in Linear Algebra): System of linear equations (线性方程组)
  18. 乔布斯与Google鲜为人知的故事
  19. 数据仓库之主题模型之IBM与TD金融模型
  20. 基础学编程之三个数顺序排序

热门文章

  1. 导数,方向导数与梯度的关系
  2. DnsApi简单探索(4) DNS_QUERY_CANCEL struct 及其他
  3. Linux下使用C语言访问MySQL函数
  4. 从深交所2020年创新课题看券商的数智化布局
  5. 搭建vmware虚拟化平台的基础配置,以及Hadoop平台的搭建
  6. Chrome快捷键汇总
  7. 蓝桥杯 二阶魔方旋转 暴力法
  8. 【应急响应】网站入侵篡改指南Webshell内存马查杀漏洞排查时间分析
  9. 谷歌使用技巧 20 招
  10. 记录一个 Chrome 扩展的开发过程