Dijkstra和Floyd算法 Java实现

  • Dijkstra算法
  • Dijkstra算法改进 优先队列实现
  • Floyd算法

Dijkstra算法

  • 问题描述:
    单源最短路径问题
public class Dijkstra {public static int inf=65535;public static void dijkstra(int map[][],int n,int v0) {int path[]=new int[n];//path[v]表示v到v0的最短路径的前驱顶点int minValue[]=new int[n];//minValue[v]存储v0到v的最短路径值int visit[]=new int[n];//visit[v]表示v是否已经求得最短路径int v,w,k,min;//初始化数据for(v=0;v<n;v++){visit[v]=0;minValue[v]=map[v0][v];path[v]=v0;}minValue[v0]=0;visit[v0]=1;k=0;//开始主循环,每一求得v0到某点v的最短路径for(v=1;v<n;v++){min=inf;for(w=0;w<n;w++){if(visit[w]==0&&minValue[w]<min){k=w;min=minValue[w];}}visit[k]=1;//修正当前最短路径和距离for(w=0;w<n;w++){if(visit[w]==0&&(min+map[k][w])<minValue[w]){minValue[w]=min+map[k][w];path[w]=k;}}}show(path,minValue,n);}public static void show(int path[],int minValue[],int n) {for(int v=0;v<n;v++){System.out.print(path[v]+" ");}System.out.println("");for(int v=0;v<n;v++){System.out.print(minValue[v]+" ");}}public static void main(String[] args) {int map[][]= {  {0,1,5,inf,inf,inf,inf,inf,inf},{1,0,3,7,5,inf,inf,inf,inf},{5,3,0,inf,1,7,inf,inf,inf},{inf,7,inf,0,2,inf,3,inf,inf},{inf,5,1,2,0,3,6,9,inf},{inf,inf,7,inf,3,0,inf,5,inf},{inf,inf,inf,3,6,inf,0,2,7},{inf,inf,inf,inf,9,5,2,0,4},{inf,inf,inf,inf,inf,inf,7,4,0},};dijkstra(map,map.length,0);}
}
  • 时间复杂度:O(n2)O(n^2)O(n2)

Dijkstra算法改进 优先队列实现

//优先队列实现
public static void dijkstra_priorityQueue(int map[][],int n,int v0) {class Node implements Comparable<Node> {public int index;public int weight;public Node(int index,int weight){this.index=index;this.weight=weight;}@Overridepublic int compareTo(Node o) {return this.weight-o.weight;}}int path[]=new int[n]; int visit[]=new int[n]; int minValue[]=new int[n];int k,w;PriorityQueue<Node>qu=new PriorityQueue<>();visit[v0]=1;minValue[v0]=0;for(int v=0;v<n;v++){visit[v]=0;minValue[v]=map[v0][v];path[v]=v0;qu.offer(new Node(v,minValue[v]));}while(!qu.isEmpty()) {Node node=qu.poll();k=node.index;w=node.weight;if(visit[k]==1) {continue;}visit[k]=1;for(int i=0;i<n;i++) {if(visit[i]==0&&w+map[k][i]<minValue[i]) {qu.offer(new Node(i,w+map[k][i]));minValue[i]=w+map[k][i];path[i]=k;}}}show(path,minValue,n);
}

Floyd算法

public class Floyd {public static int inf=65535;public static void floyd(int map[][],int n) {int path[][]=new int[n][n]; int minValue[][]=new int[n][n]; int v,w,k;//初始化for(v=0;v<n;v++){for(w=0;w<n;w++){minValue[v][w]=map[v][w];path[v][w]=w;}}for(k=0;k<n;k++){for(v=0;v<n;v++){for(w=0;w<n;w++){if(minValue[v][w]>(minValue[v][k]+minValue[k][w])){minValue[v][w]=minValue[v][k]+minValue[k][w];path[v][w]=path[v][k];}}}}show(path,minValue,n);}public static void show(int path[][],int minValue[][],int n) {for(int i=0;i<n;i++){for(int j=0;j<n;j++){System.out.print(path[i][j]+" ");}System.out.println("");}System.out.println("");for(int i=0;i<n;i++){for(int j=0;j<n;j++){System.out.print(minValue[i][j]+" ");}System.out.println("");}}public static void main(String[] args) {int map[][]= {  {0,1,5,inf,inf,inf,inf,inf,inf},{1,0,3,7,5,inf,inf,inf,inf},{5,3,0,inf,1,7,inf,inf,inf},{inf,7,inf,0,2,inf,3,inf,inf},{inf,5,1,2,0,3,6,9,inf},{inf,inf,7,inf,3,0,inf,5,inf},{inf,inf,inf,3,6,inf,0,2,7},{inf,inf,inf,inf,9,5,2,0,4},{inf,inf,inf,inf,inf,inf,7,4,0},};floyd(map,map.length);}
}
  • 时间复杂度:O(n3)O(n^3)O(n3)

参考书籍:《大话数据结构》

图论最短路径算法 Java实现相关推荐

  1. Dijkstra 单源最短路径算法 Java实现

    Dijkstra 单源最短路径算法 Java实现 算法导入 算法核心 复杂度分析 时间复杂度 空间复杂度 代码实现 参考资料 结尾 算法导入 在图论中,求最短路径有一个经典的算法 Dijkstra算法 ...

  2. Johnson 全源最短路径算法 Java实现

    Johnson 全源最短路径算法 Java实现 算法导入 算法核心 复杂度分析 时间复杂度 空间复杂度 代码实现 参考资料 End 算法导入 在之前的文章中,我们讲述了: 经典入门的Dijkstra算 ...

  3. POJ3615(Cow Hurdles)图论-Floyd算法JAVA高速IO外挂!

    POJ3615(Cow Hurdles) 图论-Floyd算法JAVA高速IO外挂! package classical_algorithm.graph.FloydWarshall; //http:/ ...

  4. 数据结构与算法--图论最短路径算法应用-词阶求解

    最短路径案例 词梯应用,在一个词梯中,每个单词均由前一个单词改变一个字母而得到.例如,我们通过一系列单字母替换而得到zero转换为five,如下:five:zero,hero,here,hire,fi ...

  5. Dijkstra最短路径算法——java代码实现

    具体的算法详解可以看这篇博客Dijkstra最短路径算法详解. 这里我利用.txt文件存储了有向加权图中顶点之间的连接关系以及边上的权重,文件格式如下: 代码所构造的有向加权图如下: package ...

  6. 算法导论——24.2 DAG最短路径算法java实现

    介绍 Bellman-Ford算法能在更普遍的情况下(存在负权边)解决单源点最短路径问题,但是对于DAG,可以有更加简化的算法去计算,使得时间复杂度更低. 针对DAG的特点,以拓扑排序为基础,提出了解 ...

  7. dijkstra邻接表_掌握算法-图论-最短路径算法-Dijkstra算法

    如果图是赋权图,那么问题就变得更困难了不过我们仍然可以使用来自无权情形时的想法. 我们保留所有与前面相同的信息.因此,每个顶点或者标记为Known的,或者标记为Unknown的.像之前一样,对每一个顶 ...

  8. 图论最短路径算法——Dijkstra

    说实在的,这算法很简单,很简单,很简单--因为它是贪心的,而且码量也小,常数比起SPFA也小. 主要思想 先初始化,dis[起点]=0,其它皆为无限大. 还要有一个bz数组,bz[i]表示i是否确定为 ...

  9. 带权图的最短路径算法(Dijkstra)实现

    一,介绍 本文实现带权图的最短路径算法.给定图中一个顶点,求解该顶点到图中所有其他顶点的最短路径 以及 最短路径的长度.在决定写这篇文章之前,在网上找了很多关于Dijkstra算法实现,但大部分是不带 ...

最新文章

  1. 关于PPP Multilink协议的配置
  2. python开源报表系统_流程设计器、表单设计器和简单报表管理开源OA系统smart-web...
  3. Linux什么是文件IO,linux中文件IO
  4. CNCF 新增两个孵化项目 | 云原生生态周报 Vol. 58
  5. transient-java 关键字
  6. 自己实现一些JQuery插件-----------------------------------(一)
  7. python 示例_Python date isoweekday()方法与示例
  8. Selenium2+python自动化5-操作浏览器基本方法
  9. mysql哪些字段适合索引_(转)Mysql哪些字段适合建立索引
  10. 南开大学计算机学院课表,南开大学本科课程教学大纲.pdf
  11. TypeError: Cannot set properties of undefined (setting ‘innerHTML‘)
  12. 【APIO2015】Bali Sculptures
  13. 数据聚合与分组运算——GroupBy
  14. 分布式存储系统学习笔记(一)—什么是分布式系统(2)—数据分布
  15. cdr X6 64位32位缩略图补丁包
  16. php验证码汉字显示音节,普通话拼音PHP 标调音节 1403个
  17. ZYNQ从放弃到入门(三)- 中断(一)
  18. python执行方式和设置_03-Python执行方式和Pycharm设置
  19. ADC 采集电池电量
  20. Android - 双向绑定

热门文章

  1. 探究白质纤维与大脑皮层surface的连接
  2. Spring JDBC,JDBCTemplate对象简化JDBC的开发
  3. HTML5+CSS3第一天
  4. 一分钟了解阿里云产品:补丁管理
  5. java字符编码详解_java字符编码详解
  6. ZedGraph设置刻度轴的颜色、刻度文本颜色以及网格线的颜色
  7. JavaScript——运用JS做出当前12小时制的日期,其中包含(年、月、日、星期、小时、分钟、秒)计时的效果.
  8. 【MQTT基础篇(十)】QoS 服务质量等级
  9. 【博弈论基础与几大经典模型】古诺模型、斯塔克尔伯格模型Stackelberg Game、价格领导模型、Bertrand模型、Sweezy模型
  10. N沟道还是P沟道MOSFET