图最短路径之Floyd
Floyd Warshall Algorithm
算法参考地址:Floyd Warshall Algorithm | DP-16 - GeeksforGeeks
算法的简介
Floyd 用于求解所有对最短路径问题。问题在于在给定边加权(可以是负权边)有向图中查找每对顶点之间的最短距离。
时间复杂度: O(V^3)
空间复杂度: O(V^2)
例:
Input:
graph[][] = { {0, 5, INF, 10},
{INF, 0, 3, INF},
{INF, INF, 0, 1},
{INF, INF, INF, 0} }
which represents the following graph
10
(0)------->(3)
| /|\
5 | |
| | 1
\|/ |
(1)------->(2)
3
Note that the value of graph[i][j] is 0 if i is equal to j
And graph[i][j] is INF (infinite) if there is no edge from vertex i to j.
Output:
Shortest distance matrix
0 5 8 9
INF 0 3 4
INF INF 0 1
INF INF INF 0
算法的过程
Floyd 算法 我们初始化与输入图矩阵相同的解矩阵作为第一步。然后,我们通过将所有顶点视为中间顶点来更新解矩阵。这个想法是逐个选择所有顶点并更新所有最短路径,其中包括选择的顶点作为最短路径中的中间顶点。当我们选择顶点数 k 作为中间顶点时,我们已经将顶点 {0, 1, 2, .. k-1} 视为中间顶点。对于源顶点和目标顶点的每对 (i, j),有两种可能的情况。 1) k 不是从 i 到 j 的最短路径中的中间顶点。我们保持 disti 的值不变。 2) k 是从 i 到 j 的最短路径中的中间顶点。我们将 disti 的值更新为 disti + distk 如果 disti > disti + distk 下图显示了所有对最短路径问题中的上述最优子结构属性。
算法的实现
golang
// F 代表两点之间不可达
const F = 10000
func floyd(graph [][]int) [][]int {
n := len(graph)
dist := make([][]int, n)
for i := 0; i < n; i++ {
dist[i] = make([]int, n)
}
copy(dist, graph)
for k := 0; k < n; k++ {
for i := 0; i < n; i++ {
for j := 0; j < n; j++ {
if dist[i][k]+dist[k][j] < dist[i][j] {
dist[i][j] = dist[i][k] + dist[k][j]
}
}
}
}
return dist
}
Java
class Floyd {
private final static int VERTEX = 7;
private final static int[][] MATRIX = new int[VERTEX][VERTEX];
private final static int MAX_VALUE = 100000;
/**
* 初始化邻接矩阵
*/
static void initMatrix() {
for (int i = 0; i < VERTEX; i++) {
for (int j = 0; j < VERTEX; j++) {
MATRIX[i][j] = MAX_VALUE;
}
}
}
/**
* 初始化边
*/
static void initEdge() {
MATRIX[0][1] = 6;
MATRIX[0][3] = 2;
MATRIX[1][2] = 5;
MATRIX[1][5] = 3;
MATRIX[3][4] = 5;
MATRIX[3][1] = 7;
MATRIX[4][6] = 1;
MATRIX[5][4] = 2;
MATRIX[5][2] = 3;
}
private static void floyd(int[][] matrix) {
for (int m = 0; m < matrix.length; m++) {
for (int i = 0; i < matrix.length; i++) {
for (int j = 0; j < matrix.length; j++) {
if (matrix[i][m] + matrix[m][j] < matrix[i][j]) {
matrix[i][j] = matrix[i][m] + matrix[m][j];
}
}
}
}
}
public static void main(String[] args) {
initMatrix();
initEdge();
//调用算法计算最短路径
floyd(MATRIX);
}
}
图最短路径之Floyd的更多相关文章
- 经典问题----最短路径(Floyd弗洛伊德算法)(HDU2066)
问题简介: 给定T条路,S个起点,D个终点,求最短的起点到终点的距离. 思路简介: 弗洛伊德算法即先以a作为中转点,再以a.b作为中转点,直到所有的点都做过中转点,求得所有点到其他点的最短路径,Flo ...
- 数据结构与算法--最短路径之Floyd算法
数据结构与算法--最短路径之Floyd算法 我们知道Dijkstra算法只能解决单源最短路径问题,且要求边上的权重都是非负的.有没有办法解决任意起点到任意顶点的最短路径问题呢?如果用Dijkstra算 ...
- 最短路径-Dijkstra+Floyd+Spfa
Dijkstra算法: Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Dijkstra ...
- 图->最短路径->多源最短路径(弗洛伊德算法Floyd)
文字描述 求每一对顶点间的最短路径,可以每次以一个顶点为源点,重复执行迪杰斯特拉算法n次.这样,便可求得每一对顶点之间的最短路径.总的执行时间为n^3.但是还有另外一种求每一对顶点间最短路径的方法,就 ...
- 图的最短路径---弗洛伊德(Floyd)算法浅析
算法介绍 和Dijkstra算法一样,Floyd算法也是为了解决寻找给定的加权图中顶点间最短路径的算法.不同的是,Floyd可以用来解决"多源最短路径"的问题. 算法思路 算法需要 ...
- 图结构练习——最短路径(floyd算法(弗洛伊德))
图结构练习——最短路径 Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^ 题目描述 给定一个带权无向图,求节点1到节点n的最短路径. 输 ...
- 图的最短路径算法-- Floyd算法
Floyd算法求的是图的任意两点之间的最短距离 下面是Floyd算法的代码实现模板: ; ; // maxv为最大顶点数 int n, m; // n 为顶点数,m为边数 int dis[maxv][ ...
- 最短路径之Floyd算法
Floyd算法又称弗洛伊德算法,也叫做Floyd's algorithm,Roy–Warshall algorithm,Roy–Floyd algorithm, WFI algorithm. Floy ...
- 最短路径---Dijkstra/Floyd算法
1.Dijkstra算法基础: 算法过程比prim算法稍微多一点步骤,但思想确实巧妙也是贪心,目的是求某个源点到目的点的最短距离,总的来说dijkstra也就是求某个源点到目的点的最短路,求解的过程也 ...
- 数据结构——图——最短路径D&F算法
一.Dijkstra算法(贪心地求最短距离的算法) 在此算法中,我按照自己的理解去命名,理解起来会轻松一些. #define MAXSIZE 100 #define UNVISITED 0 #defi ...
随机推荐
- 普冉PY32系列(十五) PY32F0系列的低功耗模式
目录 普冉PY32系列(一) PY32F0系列32位Cortex M0+ MCU简介 普冉PY32系列(二) Ubuntu GCC Toolchain和VSCode开发环境 普冉PY32系列(三) P ...
- (更新中)Python、JavaScript、Java和C++语言的语法对比与梳理
目录 引言 1. 构造函数 Python JavaScript Java C++ 2. 构造类 Python JavaScript Java C++ 3. 总结 引言 在开发过程中不免需要用到多种编程 ...
- 01. go-admin的下载与启动
目录 一.介绍 二.新建空文件夹 三.获取后台源码并启动 1.下载编译go代码 2.配置命令到goland IDE ,debug启动 四.获取前端ui源码并启动 1.下载编译go代码 2.启动项目 * ...
- anaconda安装cv2库
在安装cv2库之前,需要进行以下准备工作: 安装Anaconda 如果还没有安装Anaconda,可以在官网上下载对应操作系统的Anaconda安装包,然后按照提示进行安装.安装完成后,可以在终端中输 ...
- SQL中常用的字符串REPLACE函数和LEN函数详解!
首发微信公众号:SQL数据库运维 原文链接:https://mp.weixin.qq.com/s?__biz=MzI1NTQyNzg3MQ==&mid=2247485212&idx=1 ...
- windows上安装mysql-5.6.44-winx64
配置MySQL配置文件my.ini.datadir一般和安装目录是分开存放的 [mysqld] # 设置3306端口 port=3306 # 设置mysql的安装目录 ---这里输入你安装的文件路径- ...
- c++ 友元类 友元类方法
一.友元类 #pragma once #include"Tv.h" class Remote { public: void chanDown(Tv& tv); }; #pr ...
- Validate插件的自定义验证方法入门(结合Ajax实现用户名的数据库查重)
概述 本文介绍Validate自定义表单校验方式.Validate插件虽然提供了丰富的验证规则,但在很多时候仍然很难满足我们的开发需求,在注册页面我们需要通过ajax验证用户输入的用户名是否已经被他人 ...
- OpenQA.Selenium.WebDriverException The HTTP request to the remote WebDriver server for URL timed out
OpenQA.Selenium.WebDriverException:"The HTTP request to the remote WebDriver server for URL htt ...
- mysql存储地理信息的方法
MySQL 存储地理信息通常使用 GEOMETRY 数据类型或其子类型(如 POINT, LINESTRING, POLYGON 等).为了支持这些数据类型,MySQL 提供了 SPATIAL 索引, ...