算法描述:

Floyd算法又称为弗洛伊德算法,插点法,是一种用于寻找给定的加权图中顶点间最短路径的算法。从图的带权邻接矩阵A=[a(i,j)] n×n开始,递归地进行n次更新,即由矩阵D(0)=A,按一个公式,构造出矩阵D(1);又用同样地公式由D(1)构造出D(2);……;最后又用同样的公式由D(n-1)构造出矩阵D(n)。矩阵D(n)的i行j列元素便是i号顶点到j号顶点的最短路径长度,称D(n)为图的距离矩阵,同时还可引入一个后继节点矩阵path来记录两点间的最短路径。

核心思路:通过一个图的权值矩阵求出它的每两点间的最短路径矩阵。

算法过程:

把图用邻接距阵G表示出来,如果从Vi到Vj有路可达,则G[i,j]=d,d表示该路的长度;否则G[i,j]=无穷大。定义一个距阵D用来记录所插入点的信息,D[i,j]表示从Vi到Vj需要经过的点,初始化D[i,j]=j。把各个顶点插入图中,比较插点后的距离与原来的距离,G[i,j] = min( G[i,j], G[i,k]+G[k,j] ),如果G[i,j]的值变小,则D[i,j]=k。    在G中包含有两点之间最短道路的信息,而在D中则包含了最短通路径的信息。比如,要寻找从V5到V1的路径。根据D,假如D(5,1)=3则说明从V5到V1经过V3,路径为{V5,V3,V1},如果D(5,3)=3,说明V5与V3直接相连,如果D(3,1)=1,说明V3与V1直接相连。

优缺点分析:

Floyd算法适用于APSP(All Pairs Shortest Paths),稠密图效果最佳,边权可正可负。此算法简单有效,由于三重循环结构紧凑,对于稠密图,效率要高于执行|V|次Dijkstra算法。

优点:容易理解,可以算出任意两个节点之间的最短距离,代码编写简单;

缺点:时间复杂度为O(n3),比较高,不适合计算大量数据。

代码实现:

#include

#include

#define MAXVERTEX 8

#define INF 65535

typedef char VertexType;

typedef int EdgeType;

typedef struct MGraph

{

VertexType vertex[MAXVERTEX];

EdgeType edge[MAXVERTEX][MAXVERTEX];

int numvex;

int numedge;

}MGraph;

static int D[MAXVERTEX][MAXVERTEX];

static int P[MAXVERTEX][MAXVERTEX];

void CreateMGraph(MGraph *G)

{

int i = 0,j = 0,k = 0,w = 0;

VertexType c;

printf("请输入顶点数和边数:\n");

scanf("%d,%d",&G->numvex,&G->numedge);

for(i = 0;i < G->numvex;i++)

{

for(j = 0;j < G->numvex;j++)

{

if(i == j)

{

G->edge[i][j] = 0;

}

else

{

G->edge[i][j] = INF;

}

}

}

printf("请输入顶点的值:\n");

fflush(stdin);

scanf("%c",&c);

while(i < G->numvex)

{

if(c == '\n')

break;

else

{

G->vertex[i] = c;

i++;

scanf("%c",&c);

}

}

fflush(stdin);

for(k = 0;k < G->numedge;k++)

{

printf("请输入边vi-vj所依附的顶点下标 i 和 j,以及权重w:\n");

scanf("%d,%d,%d",&i,&j,&w);

G->edge[i][j] = w;

G->edge[j][i] = G->edge[i][j];

}

}

void Floyd(MGraph *G)

{

int i,j,k;

//初始化

for(i = 0;i < G->numvex;i++)

{

for(j = 0;j < G->numvex;j++)

{

D[i][j] = G->edge[i][j];

P[i][j] = j;

}

}

for(k = 0;k < G->numvex;k++)

{

for(i = 0;i < G->numvex;i++)

{

for(j = 0;j < G->numvex;j++)

{

if(D[i][j] > D[i][k] + D[k][j])

{

D[i][j] = D[i][k] + D[k][j];

P[i][j] = P[i][k];

}

}

}

}

printf("\n P矩阵为:\n");

for(i = 0;i < G->numvex;i++)

{

for(j = 0;j < G->numvex;j++)

{

printf("%d ",P[i][j]);

}

printf("\n");

}

}

void PrintPath(MGraph *G)

{

int i,j,k;

for(i = 0;i < G->numvex;i++)

{

for(j = i+1;j < G->numvex;j++)

{

printf("V%d-V%d minimum weight:%d ",i,j,D[i][j]);

k = P[i][j];

printf("Path: V%d",i);

while(k != j)

{

printf("-->V%d",k);

k = P[k][j];

}

printf("-->V%d\n",j);

}

printf("\n");

}

}

int main()

{

MGraph G;

CreateMGraph(&G);

Floyd(&G);

PrintPath(&G);

return 0;

}

Floyd算法&lpar;弗洛伊德算法&rpar; 百度百科

核心代码 for(int k=1; k<=NODE; ++k)//对于每一个中转点 for(int i=0; i<=NODE; ++i)//枚举源点 for(int j=0; j<= ...

经典问题----最短路径(Floyd弗洛伊德算法)(HDU2066)

问题简介: 给定T条路,S个起点,D个终点,求最短的起点到终点的距离. 思路简介: 弗洛伊德算法即先以a作为中转点,再以a.b作为中转点,直到所有的点都做过中转点,求得所有点到其他点的最短路径,Flo ...

弗洛伊德算法(Floyd算法)

原博来自http://www.cnblogs.com/skywang12345/ 弗洛伊德算法介绍 和Dijkstra算法一样,弗洛伊德(Floyd)算法也是一种用于寻找给定的加权图中顶点间最短路径的 ...

弗洛伊德算法(Floyd )

package com.rao.graph; /** * @author Srao * @className Floyd * @date 2019/12/11 18:43 * @package com ...

Floyd&lpar;弗洛伊德&rpar;算法&lpar;C语言&rpar;

转载:https://blog.csdn.net/qq_35644234/article/details/60875818 Floyd算法的介绍 算法的特点 弗洛伊德算法是解决任意两点间的最短路径的一 ...

Floyd最短路算法

Floyd最短路算法 ----转自啊哈磊[坐在马桶上看算法]算法6:只有五行的Floyd最短路算法 暑假,小哼准备去一些城市旅游.有些城市之间有公路,有些城市之间则没有,如下图.为了节省经费以及方便计 ...

数据结构C语言版 弗洛伊德算法实现

/* 数据结构C语言版 弗洛伊德算法  P191 编译环境:Dev-C++ 4.9.9.2 */ #include #include # ...

【啊哈!算法】算法6:只有五行的Floyd最短路算法

暑假,小哼准备去一些城市旅游.有些城市之间有公路,有些城市之间则没有,如下图.为了节省经费以及方便计划旅程,小哼希望在出发之前知道任意两个城市之前的最短路程.         上图中有 ...

Floyd判圈算法

Floyd判圈算法 leetcode 上 编号为202 的happy number 问题,有点意思.happy number 的定义为: A happy number is a number defi ...

随机推荐

yii2 实战教程之如何安装

作者:白狼 出处:http://www.manks.top/document/install.html 本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则 ...

php MySQL数据库操作类源代码

php MySQL数据库操作类源代码: <?php class MySQL{ private $host; //服务器地址 private $name; //登录账号 private $pwd; ...

HP ILO2 使用详细教程

iLO是Intergrated Light-Out的缩写,是惠普特有的远程管理功能,目前最新的版本是iLO2.通过iLO2可以实现硬件级别的服务器远程管理,包括开关机.重启.服务器状态的监控.虚拟KV ...

【angular】angular如何让传递变量参数&plus;ng-change的使用

HTML:

java之内存分布图

前言 不关我们是创建基本数据类型的变量还是引用数据类型的变量,jvm都会通过内存分布去编译和运行程序. 内存一般分为栈区.堆区.方法区(方法区里面包含常量池) 栈区一般存放变量(局部变量).方法的参数 ...

CentOS6&period;5 添加开机自启动脚本

有时候我们需要Linux系统在开机的时候自动加载某些脚本或系统服务.在解问题之前先来看看Linux的启动流程. 一.Linux的启动流程 主要顺序就是: 1. 加载内核 2. 启动初始化进程 3. 确 ...

POJ 2442 - Sequence - &lbrack;小顶堆&rsqb;&lbrack;优先队列&rsqb;

题目链接:http://poj.org/problem?id=2442 Time Limit: 6000MS Memory Limit: 65536K Description Given m sequ ...

python元组&lpar;&rpar;小括号

names = ('jack','rose','tom','jerry','james','jerry') print(names) print(names[0]) #使用元组中的元素 print(n ...

Django之 Model Field Options

以下这些选项都是可选择的,非固定要求. 1)null,注意在CharField或者TextField里避免使用null,因为其存储的值是空字符串而不是NULL 2)blank该字段是否可以为空.如果为 ...

弗洛伊德算法c语言path,Floyd算法(弗洛伊德算法)相关推荐

  1. java合一算法_Prolog语言的编译原理:合一算法

    Prolog语言的编译原理:合一算法 分类:软考 | 更新时间:2016-07-08| 来源:转载 Prolog是一种基于谓词演算的程序设计语言.Prolog是一种说明性语言,它的基本意思是程序员着重 ...

  2. rsa算法c语言实现_数据结构与算法之线性表-顺序表实现(C语言版本)

    原文托管在Github: https://github.com/shellhub/blog/issues/52 数据结构与算法之线性表-顺序表实现(C语言版本) 前言 数据结构与算法是一个程序员必备的 ...

  3. c语言代码先来先服务算法_C语言十大经典排序算法(动态演示+代码,值得收藏)...

    以前也零零碎碎发过一些排序算法,但排版都不太好,又重新整理一次,排序算法是数据结构的重要部分,系统地学习很有必要. 时间.空间复杂度比较 排序算法 平均时间复杂度 最差时间复杂度 空间复杂度 数据对象 ...

  4. c4.5算法 程序语言,决策树之C4.5算法详解-Go语言中文社区

    决策树之C4.5算法详解 主要内容 C4.5算法简介 分裂属性的选择--信息增益率 连续型属性的离散化处理 剪枝--PEP(Pessimistic Error Pruning)剪枝法 缺失属性值的处理 ...

  5. 最坏适应算法c语言源码,首次适应算法,最佳适应算法,最坏适应算法源代码

    这是一个非常完美的程序,输出显示的格式也很棒,里面包含首次适应算法,最佳适应算法,最坏适应算法 #include #include #define Free 0 //空闲状态 #define Busy ...

  6. 自适应对消算法c语言,LMS自适应对消算法

    LMS算法最小均方误差算法,是一种自适应滤波算法.该算法通过对输入信号进行滤波输出一个信号y(n),将输出信号与期望输出信号作差得到一个误差信号,再将误差信号输入到自适应滤波器中形成一个反馈回路.LM ...

  7. 蚁群算法C语言最短路径规划,蚁群算法规划路径

    蚁群算法可以用于路径规划,在本例中,地形矩阵用0表示无障碍物.用1表示有障碍物,机器人从1x1处走到10x10处,使用蚁群算法找最短路径. 步骤如下:初始化参数.地形矩阵.信息素矩阵和启发式因子矩阵. ...

  8. 虚拟存储页面置换算法c语言,虚拟存储器管理页面置换算法模拟实验.doc

    虚拟存储器管理页面置换算法模拟实验 淮海工学院计算机工程学院 实验报告书 课程名:< 操作系统原理A > 题 目: 虚拟存储器管理 页面置换算法模拟实验 班 级: 软件*** 学 号: 2 ...

  9. 最小生成树普里姆算法c语言代码,普里姆算法生成最小生成树-C语言描述.doc

    PAGE JIN JINGCHU UNIVERSITY OF TECHNOLOGY <数据结构(C语言描述)> 课程设计 学 院 计算机工程学院 班 级 12级软件技术1班 学 号 201 ...

最新文章

  1. bash之流程控制for循环及bash命令退出和退出状态码
  2. CSS设置按钮式超链接
  3. C++ 常用算数生成算法
  4. RocketMQ(九)—Queue分配算法
  5. 2019年最值得关注的几个公众号,好评率高达99.99%
  6. 「mysql优化专题」90%程序员面试都用得上的索引优化手册(5)
  7. 使用Python从头开始实现基线机器学习算法
  8. Cognos SDK 入门教程(一) - Hello Cognos
  9. (2022最新)Java毕业设计参考题目-题目新颖(值得收藏)
  10. PS视频降噪去噪点插件;DeNoise英文可选 支持CS6- cc2019
  11. Hibernate主键生成策略
  12. 统计学 参数估计 之 总体均值的估计
  13. 基金业绩的python分析_Python与量化多因子——聊聊Brinson业绩归因
  14. 学习问题--js图片路径加载问题
  15. #762 (Div. 3) E. MEX and Increments(贪心构造
  16. 题都城南庄---中华诗词-唐五代-崔护
  17. 二次规划及qpoases简要介绍
  18. 画图神器-drawio(配合markdown使用更佳)
  19. Hive 10、Hive的UDF、UDAF、UDTF
  20. 2020-05-09

热门文章

  1. 图片翻译怎么弄?下面分享几招图片翻译的方法
  2. rime|小狼毫 敏感词过滤效果
  3. Python与图像处理8
  4. 高端机市场卡位战:iQOO能否博得一席之地?
  5. vue 简介 (MVVM介绍,超详细)
  6. 实验一 验证74LS181运算和逻辑功能
  7. Python后台运行 -- nohup python xxx.py
  8. 自编码器的理解与应用
  9. 了解一下chirp,扫频信号的生成
  10. 正则表达式的学习总结