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

一、Dijkstra算法

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

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算法才是更巧妙、快速的一种算法
city
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];}}}}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/569830.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL日志分析

一、MySQL日志简介 &#xff08;一&#xff09;、mysql日志的种类&#xff0c;一般来说&#xff0c;日志有五种&#xff0c;分别为&#xff1a; 错误日志&#xff1a;log_error (记录启动&#xff0c;运行&#xff0c;停止mysql时出现的信息)二进制日志&#xff1a;log_bin &…

图论算法(三)--最短路径 的Bellman-Flod [ 带负权值图 ] 的解法(JAVA )

Bellman-Flod算法 对于带有负权值的图&#xff0c;我们已经不能通过Dijkstra算法进行求解了 原因&#xff1a;Dijkstra每次都会找一个距源点&#xff08;设为s&#xff09;最近的点&#xff0c;然后将该距离定为这个点到源点的最短路径&#xff1b;如果一个顶点u被加入了book…

SpringCloud介绍(一)

1.1 SpringCloud介绍 1.1.1 微服务架构演化 简而言之&#xff0c;微服务就是开发一组小型服务的方式来开发一个独立的应用系统&#xff0c;每个小型服务都运行在自己的进程中&#xff0c;并采用HTTP资源API轻量级的机制来互相通信。这些服务围绕业务功能进行构建&…

最短路径问题总结,时间复杂度,空间复杂度对比(JAVA)

最短路径问题总结 图中还有些地方没有完善&#xff0c;但是一时也没没办法解决&#xff0c;希望大家知道的能够提供一下表中不足的地方&#xff0c;万分感谢&#xff01;&#xff01;&#xff01; 最短路径算法&#xff08;一&#xff09;–DFS/BFS求解&#xff08;JAVA &…

树--树的基本性质(JAVA)

前几篇文章介绍了图的搜索算法&#xff0c;最短路径算法&#xff0c;接下来介绍树&#xff1a; 树和图 树实际上就是不含回路的无向连通图 虽然树不连通&#xff0c;没有回路了&#xff0c;但是这也使得树这种数据结构有了更多的特性&#xff1a; 1.一棵树中的任意两个结点…

看后端程序员调试CORS的姿势

# 目录 为什么有同源策略&#xff1f; 需要解决的问题CORS跨域请求方案 preflightwithCredentials附&#xff1a;高效、优雅地调试CORS实现为什么有同源策略&#xff1f; 同源策略Same Origin Policy 是一种约定&#xff0c;是浏览器最核心的安全功能&#xff1a;该策略允许在…

图论算法(四)--最小生成树的Kruskal [ 加边 ] 、Prim [ 加点 ] 的解法(JAVA)

之前我们介绍了求最短路径算法&#xff0c;现在又讲最小生成树算法&#xff0c;这两个算法有什么区别呢&#xff1f; 首先要明确&#xff0c;最短路径和最小生成树是两个不同的概念。 最短路径是对于一个图的两个结点而言的。在一个图中&#xff0c;结点A通过某些结点和边可以…

express+handlebars 快速搭建网站前后台

最近在重构公司网站&#xff0c;原来网站使用PHP&#xff0c;前后端不分离&#xff0c;添加与更新网站内容仍使用原始方法&#xff0c;先出布局再把调好的布局给PHP后端开发&#xff0c;花时间长&#xff0c;维护不易。因此决定将网站前后端分离&#xff0c;核心功能含网站下单…

定义一个二维数组并输入数据,将二维数组元素的值按升序排列,并输出排序后的二维数组。

目录 问题&#xff1a; 回顾&#xff1a; 给出两种做法&#xff1a; 解法一&#xff1a;调用qsort 函数进行排序 代码&#xff1a; 运行结果&#xff1a; 解法二&#xff1a;冒泡排序 代码&#xff1a; 运行结果: 回顾里的4种方法的模板参考&#xff1a; 1.冒泡排序…

第五届省赛(软件类)真题----Java大学C组答案及解析

第五届省赛&#xff08;软件类&#xff09;真题—-Java大学C组答案及解析 杨辉三角调和级数回文素数过大年位平方和单位分数n级台阶 一、杨辉三角 二项式的系数规律&#xff0c;我国数学家很早就发现了。 如【图1.png】&#xff0c;我国南宋数学家杨辉1261年所著的《详解九…

Angular4.x 安装|创建项目|目录结构|创建组件

Angular4.x 安装|创建项目|目录结构|创建组件 安装最新版本的 nodejs node.js 官网&#xff1a;https://nodejs.org/zh-cn/ 去官网下载 node.js&#xff0c;下一步下一步就可以了。只要 node.js 安装成功&#xff0c;那么 npm 也会帮你安装完成&#xff01; 注意&#xff1a;请…

第五届省赛(软件类)真题----Java大学B组答案及解析

第五届省赛&#xff08;软件类&#xff09;真题—-Java大学B组答案及解析 正则切分调和级数n的n次幂七对数字勾股定理九阶数独G将军 一、正则切分 java中提供了对正则表达式的支持。 有的时候&#xff0c;恰当地使用正则&#xff0c;可以让我们的工作事半功倍&#xff01; …

第五届省赛(软件类)真题----Java大学A组答案及解析

第五届省赛&#xff08;软件类&#xff09;真题—-Java大学A组答案及解析 子序列最大长度莱布尼茨公式n的n次幂七对数字勾股定理九阶数独矩阵射线 一、子序列最大长度 一个串的子串是指该串的一个连续的局部。如果不要求连续&#xff0c;则可称为它的子序列。 比如对串&…

第六届省赛(软件类)真题----Java大学C组答案及解析

第六届省赛&#xff08;软件类&#xff09;真题----Java大学C组答案及解析隔行变色立方尾无穷分数循环节长度格子中输出奇妙的数字加法变乘法移动距离打印大X垒骰子 一、隔行变色 Excel表的格子很多&#xff0c;为了避免把某行的数据和相邻行混淆&#xff0c;可以采用隔行变色的…

spring_01概念及案例

1.什么是IOC?   IOC概念:inverse of Controll,控制反转,所谓控制反转,就是把创建对象和维护对象关系的权利从程序中转移到spring的容器中(applicationContext.xml),而程序本身不再维护 2.什么是di? dependency injection,依赖注入,di和IOC是一个概念,spring的设计者认为di等…

斐波那契数列(二)--矩阵优化算法

之前写了一篇从斐波那契数列分析递归与动态规划&#xff08;JAVA&#xff09;来优化斐波那契数列&#xff0c;这样可以使算法的时间复杂度从O(n^2)变到O(n),这是使用递归公式f(n)f(n-1)f(n-2)求斐波那契数列的最优算法&#xff0c;但是这只是一维世界下的极限。下面我们将其从一…

第六届省赛(软件类)真题----Java大学B组答案及解析

第六届省赛&#xff08;软件类&#xff09;真题----Java大学B组答案及解析三角形面积立方变自身三羊献瑞循环节长度九数组分数加法变乘法牌型种数饮料换购垒骰子生命之树 一、三角形面积如【图1】所示。图中的所有小方格面积都是1。那么&#xff0c;图中的三角形面积应该是多少…

【学习总结】GirlsInAI ML-diary day-11-while循环

【学习总结】GirlsInAI ML-diary 总 原博github链接-day11 认识while循环执行 对于while/break/continue的认识 新值替换变量 一般while语句 无限循环 & break continue 作业 1-更新变量 这一条没什么新的东西&#xff0c;别的语言也一样&#xff1a;python在赋值时&#x…

@PathVariable、@RequestParam、@RequestBody注解

讲解更加详细的参考资料 https://blog.csdn.net/u011410529/article/details/66974974 https://www.cnblogs.com/soul-wonder/p/8920553.html PathVariable注解的作用&#xff0c;获取请求地址中传递的参数&#xff0c;即&#xff1a;从URL模版中取值。 RequestParam 是从reque…

深入浅出讲算法思想--蛮力法思想分析及应用

蛮力法&#xff08;brute force method&#xff0c;也称为穷举法或枚举法&#xff09;是一种简单直接地解决问题的方法&#xff0c;常常直接基于问题的描述&#xff0c;所以&#xff0c;蛮力法也是最容易应用的方法。虽然&#xff0c;用蛮力法设计的算法时间特性往往也是最低的…