一、Dijkstra算法

问题描述:求一个点到任意个点的距离
思路:单源最短路径问题,使用Dijkstra算法

Input:
6 9
1 2 1
1 3 12
2 3 9
2 4 3
3 5 5
4 3 4
4 5 13
4 6 15
5 6 4

Output:
0 1 8 4 13 17

import java.util.Scanner;public class minPath4 {static int[][] e = new int[10][10];static int[] book = new int[10];static int[] dis = new int[10];static int n, m;static int min = 99999999;static int mark = 0;static Scanner input = new Scanner(System.in);public static void main(String[] args) {n = input.nextInt();m = input.nextInt();for (int i = 1; i <= n; i++) {for (int j = 1; j <= n; j++) {if (i == j) {e[i][j] = 0;} else {e[i][j] = 99999999;}}}for (int i = 1; i <= m; i++) {int a = input.nextInt();int b = input.nextInt();int c = input.nextInt();e[a][b] = c;}/*** 1到其他各点的距离* */for (int i = 1; i <= n; i++) {dis[i] = e[1][i];}book[1] = 1;dijkstra();for (int i = 1; i <= n; i++) {System.out.print(dis[i] + " ");}}public static void dijkstra() {/*** 遍历n-1次,每次找出一个 1到某个点的最短距离* */for (int i = 1; i <= n-1; i++) {min = 99999999;/*** 选出离1号点最近的顶点* */for (int j = 1; j <= n; j++) {if (book[j] == 0 && dis[j] < min) {min = dis[j];mark = j;}}book[mark] = 1;/*** 松弛* */for (int j = 1; j <= n; j++) {if (e[mark][j] < 99999999) {if (dis[j] > dis[mark] + e[mark][j]) {dis[j] = dis[mark] + e[mark][j];}}}}}
}

Dijkstra算法的时间复杂度为O(N^2)
这是采取邻接矩阵存放数据的时间复杂度。而如果采用下面的邻接表将会使算法的时间复杂度优化为O((M+N)logN)

邻接表:
数据存储思路:u[i],v[i],w[i] 代表存储u[i]——->v[i]的两个可连通的点,w[i]代表权值
first[u[i]]存放顶点u[i]的第一条边编号,next[i]存放编号为i的边的下一条边

下面给出邻接表定义和打印的代码,感兴趣的读者可以将其运用到Dijkstra算法中

import java.util.Scanner;public class minPath {static int[] u = new int[6];static int[] v = new int[6];static int[] w = new int[6];static int[] first = new int[6];static int[] next = new int[6];static int n, m;static int k;static Scanner input = new Scanner(System.in);public static void main(String[] args) {n = input.nextInt();m = input.nextInt();for (int i = 1; i <= m; i++) {u[i] = input.nextInt();v[i] = input.nextInt();w[i] = input.nextInt();for (int j = 1; j <= n; j++) {first[i] = -1;}next[i] = first[u[i]];first[u[i]] = i;}for (int i = 1; i <= n; i++) {k = first[i];while (k != -1) {System.out.println(u[k] + " " + v[k] + " " + w[k]);k = next[k];}}}
}

对于单源最短路径使用Dijkstra算法的确是一个好方法,但是如果是多源最短路径问题呢?
当然,我们可以才用n次Dijkstra算法解决,但是下面的Floyd算法貌似给了我们更友好的解法

而且当出现带有负权值的图的时候,这Dijkstra算法就没有办法解决了,我在这篇文章整理了另一种算法来针对单源带负权最短路径问题。
图论算法(三)–最短路径 的Bellman-Flod [ 带负权值图 ] 的解法(JAVA )


二、Floyd算法

问题描述:有如下的地图,求任意两点之间的最短距离
思路:典型的多源最短路径问题,这大可以使用n^2次深搜或者广搜完成,但是下面的Floyd算法才是更巧妙、快速的一种算法

Input:
4 8
1 2 2
1 3 6
1 4 4
2 3 3
3 1 7
3 4 1
4 1 5
4 3 12
Output:
0 2 5 4
9 0 3 4
6 8 0 1
5 7 10 0

import java.util.Scanner;public class minPath {static int[][] e = new int[10][10];static int n, m;static Scanner input = new Scanner(System.in);public static void main(String[] args) {n = input.nextInt();m = input.nextInt();for (int i = 1; i <= n; i++) {for (int j = 1; j <= m; j++) {if (i == j) {e[i][j] = 0;} else {e[i][j] = 99999999;}}}for (int i = 1; i <= m; i++) {int a = input.nextInt();int b = input.nextInt();int c = input.nextInt();e[a][b] = c;}floyd();for (int i = 1; i <= n; i++) {for (int j = 1; j <= n; j++) {System.out.print(e[i][j] + " ");}System.out.println();}}public static void floyd() {for (int k = 1; k <= n; k++) {for (int i = 1; i <= n; i++) {for (int j = 1; j <= n; j++) {if (e[i][j] > e[i][k] + e[k][j]) {e[i][j] = e[i][k] + e[k][j];}}}}}
}

图论算法(二)-最短路径的Dijkstra [ 单源 ] 和Floyd[ 多源 ] 解法(JAVA )相关推荐

  1. 图论算法之最短路径(Dijkstra、Floyd、Bellman-ford和SPFA)

    图论算法之最短路径(Dijkstra.Floyd.Bellman-ford和SPFA) 1.图论最短路径概述 图论算法为了求解一个顶点到另一个顶点的最短路径,即如果从图中某一顶点(称为源点)到达另一顶 ...

  2. 【图论算法】最短路径算法(无权最短路径、Dijkstra算法、带负边值的图、无圈图)

    本篇博客将考察各种最短路径问题.     无权最短路径     Dijkstra 算法     具有负边值的图     无圈图     所有顶点对间的最短路径     最短路径的例子–词梯游戏 输入是 ...

  3. dijkstra 算法_最短路径问题Dijkstra算法详解

    1.Dijkstra算法介绍 · 算法起源: · Djkstra 算法是一种用于计算带权有向图中单源最短路径(SSSP:Single-Source Shortest Path)的算法,由计算机科学家E ...

  4. 数学建模十大算法04—图论算法(最短路径、最小生成树、最大流问题、二分图)

    文章目录 一.最短路径问题 1.1 两个指定顶点之间的最短路径 1.1.1 Dijkstra算法 1.1.2 Matlab函数 1.2 每对顶点之间的最短路径 1.2.1 Dijkstra算法 1.2 ...

  5. 【恋上数据结构】图代码实现、最小生成树(Prim、Kruskal)、最短路径(Dijkstra、Bellman-Ford、Floyd)

    图 最小生成树(Minimum Spanning Tree) Prim算法 切分定理 Prim算法 – 执行过程 Prim算法 – 代码实现 Kruskal算法 Kruskal算法 – 执行过程 Kr ...

  6. 图论算法讲解--最短路--Dijkstra算法

    一.绪论 要学习最短路算法我们首先应该知道什么是图以及什么是最短路. 图在离散数学中的定义为:图G=(V,E)是一个二元组(V,E)使得E⊆[V]的平方,所以E的元素是V的2-元子集.为了避免符号上的 ...

  7. java按顺序售票方法_java_Java代码实践12306售票算法(二),周五闲来无事,基于上一篇关 - phpStudy...

    Java代码实践12306售票算法(二) 周五闲来无事,基于上一篇关于浅析12306售票算法(java版)理论,进行了java编码实践供各位读者参考(以下为相关代码的简单描述) 1.订票工具类 1.1 ...

  8. 图论-单源最短路径算法(拓扑,Dijkstra,Floyd,SPFA)

    前言 单源最短路径是学习图论算法的入门级台阶,但刚开始看的时候就蒙了,什么有环没环,有负权没负权,下面就来总结一下求单源最短路径的所有算法以及其适用的情况. 单源最短路径 设定图中一个点为源点,求其他 ...

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

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

最新文章

  1. 41款实用工具,数据获取、清洗、建模、可视化都有了
  2. Advanced Installer 制作.NetWeb部署安装包
  3. java stream 多个filter_恕我直言你可能真的不会java第3篇:Stream的Filter与谓词逻辑...
  4. jqgrid常用操作
  5. 程序员获取编程灵感的10 种方式
  6. 决策树信息熵计算_决策树熵|熵计算
  7. Gitlab 从 12.1 版本开始将不再支持 MySQL !!!
  8. mathtype 公式分节隐藏
  9. Python编程学习:中兴LTE网管MML命令脚本生成器
  10. 机动车验车需要的材料和流程(转载)
  11. 软件测试归纳法调试,《软件测试艺术》读书笔记(34)_归纳法、演绎法、回溯法、测试法调试及其原则、错误分析...
  12. Android App开发动画特效中帧动画和电影淡入淡出动画的讲解及实战(附源码和演示视频 简单易懂)
  13. 【华为OD机试真题 JS】IPv4地址转换成整数
  14. 【fragment】Android Fragments 详细使用
  15. 关于大学生课余时间分配利用的调查报告
  16. 实战新浪微博、腾讯微博的分享功能
  17. 人工智能第2章 智能 Agent
  18. pool win10提示bad_Win10出现bad pool header蓝屏怎么修复?
  19. MATLAB:变量类型与赋值
  20. 排序系列三: 二分查找法

热门文章

  1. mysql order by rand 优化_mysql order by与by rand() 的优化经验
  2. lvds接口屏线安装图解_五分钟让你学会液晶拼接屏安装方法
  3. 两边双虚线是什么意思_行星减速机生产厂家解析行星减速机双支撑与单支撑
  4. C++ 文本文件的读取和写入
  5. MySql数据类型介绍
  6. 没有bug队——加贝——Python 练习实例 11,12
  7. TensorFlow3-会话
  8. telnet用法 测试端口号是否可以使用
  9. 【Python爬虫】Windows环境下wxpy不需每次登陆重新扫描
  10. 【转】Docker学习_本地/容器文件互传(5)