图论算法(二)-最短路径的Dijkstra [ 单源 ] 和Floyd[ 多源 ] 解法(JAVA )
一、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 )相关推荐
- 图论算法之最短路径(Dijkstra、Floyd、Bellman-ford和SPFA)
图论算法之最短路径(Dijkstra.Floyd.Bellman-ford和SPFA) 1.图论最短路径概述 图论算法为了求解一个顶点到另一个顶点的最短路径,即如果从图中某一顶点(称为源点)到达另一顶 ...
- 【图论算法】最短路径算法(无权最短路径、Dijkstra算法、带负边值的图、无圈图)
本篇博客将考察各种最短路径问题. 无权最短路径 Dijkstra 算法 具有负边值的图 无圈图 所有顶点对间的最短路径 最短路径的例子–词梯游戏 输入是 ...
- dijkstra 算法_最短路径问题Dijkstra算法详解
1.Dijkstra算法介绍 · 算法起源: · Djkstra 算法是一种用于计算带权有向图中单源最短路径(SSSP:Single-Source Shortest Path)的算法,由计算机科学家E ...
- 数学建模十大算法04—图论算法(最短路径、最小生成树、最大流问题、二分图)
文章目录 一.最短路径问题 1.1 两个指定顶点之间的最短路径 1.1.1 Dijkstra算法 1.1.2 Matlab函数 1.2 每对顶点之间的最短路径 1.2.1 Dijkstra算法 1.2 ...
- 【恋上数据结构】图代码实现、最小生成树(Prim、Kruskal)、最短路径(Dijkstra、Bellman-Ford、Floyd)
图 最小生成树(Minimum Spanning Tree) Prim算法 切分定理 Prim算法 – 执行过程 Prim算法 – 代码实现 Kruskal算法 Kruskal算法 – 执行过程 Kr ...
- 图论算法讲解--最短路--Dijkstra算法
一.绪论 要学习最短路算法我们首先应该知道什么是图以及什么是最短路. 图在离散数学中的定义为:图G=(V,E)是一个二元组(V,E)使得E⊆[V]的平方,所以E的元素是V的2-元子集.为了避免符号上的 ...
- java按顺序售票方法_java_Java代码实践12306售票算法(二),周五闲来无事,基于上一篇关 - phpStudy...
Java代码实践12306售票算法(二) 周五闲来无事,基于上一篇关于浅析12306售票算法(java版)理论,进行了java编码实践供各位读者参考(以下为相关代码的简单描述) 1.订票工具类 1.1 ...
- 图论-单源最短路径算法(拓扑,Dijkstra,Floyd,SPFA)
前言 单源最短路径是学习图论算法的入门级台阶,但刚开始看的时候就蒙了,什么有环没环,有负权没负权,下面就来总结一下求单源最短路径的所有算法以及其适用的情况. 单源最短路径 设定图中一个点为源点,求其他 ...
- Dijkstra 单源最短路径算法 Java实现
Dijkstra 单源最短路径算法 Java实现 算法导入 算法核心 复杂度分析 时间复杂度 空间复杂度 代码实现 参考资料 结尾 算法导入 在图论中,求最短路径有一个经典的算法 Dijkstra算法 ...
最新文章
- 41款实用工具,数据获取、清洗、建模、可视化都有了
- Advanced Installer 制作.NetWeb部署安装包
- java stream 多个filter_恕我直言你可能真的不会java第3篇:Stream的Filter与谓词逻辑...
- jqgrid常用操作
- 程序员获取编程灵感的10 种方式
- 决策树信息熵计算_决策树熵|熵计算
- Gitlab 从 12.1 版本开始将不再支持 MySQL !!!
- mathtype 公式分节隐藏
- Python编程学习:中兴LTE网管MML命令脚本生成器
- 机动车验车需要的材料和流程(转载)
- 软件测试归纳法调试,《软件测试艺术》读书笔记(34)_归纳法、演绎法、回溯法、测试法调试及其原则、错误分析...
- Android App开发动画特效中帧动画和电影淡入淡出动画的讲解及实战(附源码和演示视频 简单易懂)
- 【华为OD机试真题 JS】IPv4地址转换成整数
- 【fragment】Android Fragments 详细使用
- 关于大学生课余时间分配利用的调查报告
- 实战新浪微博、腾讯微博的分享功能
- 人工智能第2章 智能 Agent
- pool win10提示bad_Win10出现bad pool header蓝屏怎么修复?
- MATLAB:变量类型与赋值
- 排序系列三: 二分查找法
热门文章
- mysql order by rand 优化_mysql order by与by rand() 的优化经验
- lvds接口屏线安装图解_五分钟让你学会液晶拼接屏安装方法
- 两边双虚线是什么意思_行星减速机生产厂家解析行星减速机双支撑与单支撑
- C++ 文本文件的读取和写入
- MySql数据类型介绍
- 没有bug队——加贝——Python 练习实例 11,12
- TensorFlow3-会话
- telnet用法 测试端口号是否可以使用
- 【Python爬虫】Windows环境下wxpy不需每次登陆重新扫描
- 【转】Docker学习_本地/容器文件互传(5)