概念

最短路径也是图的一个应用,即寻找图中某两个顶点的最短路径长度。

实际应用:例如确定某两个城市间的坐火车最短行车路线长度等。

Floyd algorithm

中文名就是弗洛伊德算法。

算法思路:用邻接矩阵来存储图的结构,edge[i][j]表示从结点i到结点j的最短路径长度,那么该如何计算edge[i][j]呢?首先我们可以假设当前的edge[i][j]不是最短的路径长度,必须经过k结点,比较edge[i][i]与edge[i][k]+edge[k][j]的大小(其中k的取值为所有点的编号),如果前者小,则表明i到j的最短路径为当前的edge[i][j];如果后者小,那么就需要修改当前的edge[i][j],使得edge[i][i]=edge[i][k]+edge[k][j]。

ok,下面用代码表示一下:

for (int k = ; k <= n; k++)
{
for (int i = ; i <= n; i++)
{
for (int j = ; j <= n; j++)
{
if (edge[i][k] == MAX || edge[k][j] == MAX)
continue;
if (edge[i][j] == MAX || edge[i][k] + edge[k][j] < edge[i][j])
edge[i][j] = edge[i][k] + edge[k][j];
}
}
}

上面的三层循环就是Floyd算法的核心内容,其时间复杂度为O(n3)。

Floyd算法特点

1、时间复杂度按为O(n3),所以要求被求解的图的顶点个数不能大于200个,否则容易超时。

2、利用二维矩阵来进行存储图的结构,并进行相关计算。

3、算法结束后,图中所有结点之间的最短路径也被计算完成。可以查询到任意两点间的最短距离。

与迪杰斯特拉算法比较一下,前者主要是求图中某一顶点到其余各顶点的最短路径,后者主要是求图中任意两点间的最短路径。在实际应用中要学会灵活应用。

最短路径问题-Floyd算法的更多相关文章

  1. 数据结构与算法--最短路径之Floyd算法

    数据结构与算法--最短路径之Floyd算法 我们知道Dijkstra算法只能解决单源最短路径问题,且要求边上的权重都是非负的.有没有办法解决任意起点到任意顶点的最短路径问题呢?如果用Dijkstra算 ...

  2. 最短路径之Floyd算法

    Floyd算法又称弗洛伊德算法,也叫做Floyd's algorithm,Roy–Warshall algorithm,Roy–Floyd algorithm, WFI algorithm. Floy ...

  3. 最短路径问题——floyd算法

    floyd算法和之前讲的bellman算法.dijkstra算法最大的不同在于它所处理的终于不再是单源问题了,floyd可以解决任何点到点之间的最短路径问题,个人觉得floyd是最简单最好用的一种算法 ...

  4. 最短路径---Dijkstra/Floyd算法

    1.Dijkstra算法基础: 算法过程比prim算法稍微多一点步骤,但思想确实巧妙也是贪心,目的是求某个源点到目的点的最短距离,总的来说dijkstra也就是求某个源点到目的点的最短路,求解的过程也 ...

  5. 26最短路径之Floyd算法

    Floyd算法 思想:将n个顶点的图G“分成”很多子图 每对顶点vi和vj对应子图Gij(i=0,1,…,n-1和j=0,1,…,n-1) 每对顶点vi和vj都保留一条顶点限于子图Gij中的最短路径P ...

  6. 最短路径 - 弗洛伊德(Floyd)算法

    为了能讲明白弗洛伊德(Floyd)算法的主要思想,我们先来看最简单的案例.图7-7-12的左图是一个简单的3个顶点的连通网图. 我们先定义两个二维数组D[3][3]和P[3][3], D代表顶点与顶点 ...

  7. 图的最短路径---弗洛伊德(Floyd)算法浅析

    算法介绍 和Dijkstra算法一样,Floyd算法也是为了解决寻找给定的加权图中顶点间最短路径的算法.不同的是,Floyd可以用来解决"多源最短路径"的问题. 算法思路 算法需要 ...

  8. 每一对顶点间最短路径的Floyd算法

    Floyd思想可用下式描述: A-1[i][j]=gm[i][j] A(k+1)[i][j]=min{Ak[i][j],Ak[i][k+1]+Ak[K+1][j]}    -1<=k<=n ...

  9. 图结构练习——最短路径(floyd算法(弗洛伊德))

    图结构练习——最短路径 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述  给定一个带权无向图,求节点1到节点n的最短路径.   输 ...

随机推荐

  1. Objective-C之成魔之路【13-预处理程序】

    郝萌主倾心贡献.尊重作者的劳动成果,请勿转载. 假设文章对您有所帮助.欢迎给作者捐赠.支持郝萌主,捐赠数额任意.重在心意^_^ 我要捐赠: 点击捐赠 Cocos2d-X源代码下载:点我传送 预处理提供 ...

  2. mysqldump 备份单个数据库

    mysqldump -uemove -h xx.xxx.xx.xx -P7996 -p --databases dbname >dbname.sql

  3. linux命令(29):用户组管理

    用户管理: 新建用户或组:新建用户:adduser user //新建user用户(推荐)passwd user //给user用户设置密码 新建组:groupadd test //新建test工作组 ...

  4. Kafka Consumer 启动测试类

    https://github.com/MarcoGhise/SpringKafka.git package it.demo.kafka.springkafka.listener; import org ...

  5. arm程序的反汇编程序

    这是汇编源文件: MCU:S3C2440(arm920T) 代码实现点亮个led小灯 .text .global _start _start: ldr r0,=0x56000010 @GPBCON m ...

  6. 【转】Hadoop安全实践

    前言 在2014年初,我们将线上使用的 Hadoop 1.0 集群切换到 Hadoop 2.2.0 稳定版, 与此同时部署了 Hadoop 的安全认证.本文主要介绍在 Hadoop 2.2.0 上部署 ...

  7. c++重载前置++和--

    C语言中,前置和后置++,--都不能作为左值,而在c++中,前置的++和--可以作为左值,从下面的重载运算符中也可以看出,它们返回的是引用,我不知道为什么这里和c语言中不同,但c++类似的提升还有三目 ...

  8. python--Numpy简单实用实例

    # _*_ coding:utf-8 _*_ import numpy as np #创建数组 a=np.array([[1.,7.,0.],[-2.,1.,2.]]) print a #ndarra ...

  9. vim 移植记录

    下载两个源码包: vim : ftp://ftp.vim.org/pub/vim/unix/vim-7.4.tar.bz2\ ncurses-5.8.tar.gz http://ftp.gnu.org ...

  10. 中断线程详解(Interrupt)

    在上篇文章<多线程的使用——Thread类和Runnable接口>中提到中断线程的问题.在JAVA中,曾经使用stop方法来停止线程,然而,该方法具有固有的不安全性,因而已经被抛弃(Dep ...