Floyd算法的介绍

算法的特点

弗洛伊德算法是解决任意两点间的最短路径的一种算法,可以正确处理有向图或有向图或负权(但不可存在负权回路)的最短路径问题,同时也被用于计算有向图的传递闭包。

算法的思路

通过Floyd计算图G=(V,E)中各个顶点的最短路径时,需要引入两个矩阵,矩阵S中的元素a[i][j]表示顶点i(第i个顶点)到顶点j(第j个顶点)的距离。矩阵P中的元素b[i][j],表示顶点i到顶点j经过了b[i][j]记录的值所表示的顶点。

假设图G中顶点个数为N,则需要对矩阵D和矩阵P进行N次更新。初始时,矩阵D中顶点a[i][j]的距离为顶点i到顶点j的权值;如果i和j不相邻,则a[i][j]=∞,矩阵P的值为顶点b[i][j]的j的值。 接下来开始,对矩阵D进行N次更新。第1次更新时,如果”a[i][j]的距离” > “a[i][0]+a[0][j]”(a[i][0]+a[0][j]表示”i与j之间经过第1个顶点的距离”),则更新a[i][j]为”a[i][0]+a[0][j]”,更新b[i][j]=b[i][0]。 同理,第k次更新时,如果”a[i][j]的距离” > “a[i][k-1]+a[k-1][j]”,则更新a[i][j]为”a[i][k-1]+a[k-1][j]”,b[i][j]=b[i][k-1]。更新N次之后,操作完成!

补充:以下面图为例子,b[i][j]中存储的是Vi~Vj之间的中介点,b[i][j]初始值为j,比如V0~V3最短路径是V0-->V2-->V1-->v3,在计算最短路径时转换为V0-->V2的距离加上V2-->V3的最短距离,接下来类似于递归,V2-->V3的最短路径就是以V1为中介点,V2-->V1的距离加上V1-->V3的距离。因此,b[0][3]=2

实例说明

将整体分为两个步骤

1.计算metrixD矩阵(两顶点之间的最短距离)和P矩阵(两顶点的中介点)

#include #include

void Create_metrixD_P(int** metrixD, int **P ,int VerNum, intEdgNum)

{int x, y, Weight, edg_count = 0;inti, j, k;for (i = 0; i < VerNum; ++i) {for (j = 0; j < VerNum; ++j) {

metrixD[i][j]=INT_MAX;

P[i][j]=j;

}

}while (edg_count

scanf("%d%d%d", &x, &y, &Weight);

metrixD[x- 1][y - 1] =Weight;

edg_count++;

}

}//Floyd algorithm

void Floyd(int **metirxD, int **P, intVerNum) {int n, x, y, temp = 0;//The triple loop looks for shortest paths and weights

for (n = 0; n < VerNum; ++n) {for (x = 0; x < VerNum; ++x) {for (y = 0; y < VerNum; ++y) {//The distance between two vertices is compared to the distance through a vertex

temp = (metirxD[x][n] == INT_MAX || metirxD[n][y] == INT_MAX) ? INT_MAX : (metirxD[x][n] +metirxD[n][y]);if (temp

metirxD[x][y] =temp;

P[x][y]=n;

}

}

}

}

}void Show_metrixD_P(int** metrixD, int **P, intVerNum)

{intx, y;

printf("metrixD:");for (x = 0; x < VerNum; ++x) {for (y = 0; y < VerNum; ++y) {if (metrixD[x][y] ==INT_MAX) {

printf("∞");

}else{

printf("%d", metrixD[x][y]);

}

}

printf("");

}

printf("P:");for (x = 0; x < VerNum; ++x) {for (y = 0; y < VerNum; ++y) {

printf("%d", P[x][y]);

}

printf("");

}

}int main(void)

{intVerNum, EdgNum, i;int** metrixD, **P;

printf("Enter the number of vertices and edges:");

scanf("%d%d", &VerNum, &EdgNum);

metrixD= (int**)malloc(VerNum * sizeof(int));

P= (int**)malloc(VerNum * sizeof(int));for (i = 0; i < VerNum; ++i) {

metrixD[i]= (int*)malloc(VerNum * sizeof(int));

P[i]= (int*)malloc(VerNum * sizeof(int));

}

printf("Input vertices and weights:");

Create_metrixD_P(metrixD, P, VerNum, EdgNum);

Floyd(metrixD, P, VerNum);

Show_metrixD_P(metrixD, P, VerNum);for (i = 0; i < VerNum; ++i) {free(metrixD[i]);free(P[i]);

}free(metrixD);free(P);return 0;

}

2.输出顶点之间的最短距离与路径

#include #include

#define VEXNUM 5

//Adjacency matrix: shows the distance between vertices

int metirxD[VEXNUM][VEXNUM] ={

INT_MAX,10, 5, INT_MAX,INT_MAX,

INT_MAX,INT_MAX,2, 1, INT_MAX,

INT_MAX,3, INT_MAX,9, 2,

INT_MAX,INT_MAX,INT_MAX,INT_MAX,4,7, INT_MAX,INT_MAX,5, INT_MAX

};//Path: passing vertex between two vertices

int P[VEXNUM][VEXNUM] ={0,1,2,3,4,0,1,2,3,4,0,1,2,3,4,0,1,2,3,4,0,1,2,3,4};//Floyd algorithm

voidFloyd() {int n, x, y, temp = 0;//The triple loop looks for shortest paths and weights

for (n = 0; n < VEXNUM; ++n) {for (x = 0; x < VEXNUM; ++x) {for (y = 0; y < VEXNUM; ++y) {//The distance between two vertices is compared to the distance through a vertex

temp = (metirxD[x][n] == INT_MAX || metirxD[n][y] == INT_MAX) ? INT_MAX : (metirxD[x][n] +metirxD[n][y]);if (temp

metirxD[x][y] =temp;

P[x][y]=n;

}

}

}

}

}voidShow_Path() {int x, y, temp = 0;//Output the shortest path between two vertices

for (x = 0; x < VEXNUM - 1; ++x) {for (y = x + 1; y < VEXNUM; ++y) {

printf("V%d-->V%d weight:%d path:V%d", x, y, metirxD[x][y], x);

temp=P[x][y];while (temp !=y) {

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

temp=P[temp][y];

}

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

printf("");

}

}

}int main(void)

{

Floyd();

Show_Path();return 0;

}

完整代码

#include #include

void Create_metrixD_P(int** metrixD, int **P ,int VerNum, intEdgNum)

{int x, y, Weight, edg_count = 0;inti, j, k;for (i = 0; i < VerNum; ++i) {for (j = 0; j < VerNum; ++j) {

metrixD[i][j]=INT_MAX;

P[i][j]=j;

}

}while (edg_count

scanf("%d%d%d", &x, &y, &Weight);

metrixD[x- 1][y - 1] =Weight;

edg_count++;

}

}//Floyd algorithm

void Floyd(int **metirxD, int **P, intVerNum) {int n, x, y, temp = 0;//The triple loop looks for shortest paths and weights

for (n = 0; n < VerNum; ++n) {for (x = 0; x < VerNum; ++x) {for (y = 0; y < VerNum; ++y) {//The distance between two vertices is compared to the distance through a vertex

temp = (metirxD[x][n] == INT_MAX || metirxD[n][y] == INT_MAX) ? INT_MAX : (metirxD[x][n] +metirxD[n][y]);if (temp

metirxD[x][y] =temp;

P[x][y]=n;

}

}

}

}

}void Show_metrixD_P(int** metrixD, int **P, intVerNum)

{intx, y;

printf("metrixD:");for (x = 0; x < VerNum; ++x) {for (y = 0; y < VerNum; ++y) {if (metrixD[x][y] ==INT_MAX) {

printf("∞");

}else{

printf("%d", metrixD[x][y]);

}

}

printf("");

}

printf("P:");for (x = 0; x < VerNum; ++x) {for (y = 0; y < VerNum; ++y) {

printf("%d", P[x][y]);

}

printf("");

}

}void Show_Path(int **metirxD, int **P, intVerNum) {int x, y, temp = 0;//Output the shortest path between two vertices

for (x = 0; x < VerNum - 1; ++x) {for (y = x + 1; y < VerNum; ++y) {

printf("V%d-->V%d weight:%d path:V%d", x, y, metirxD[x][y], x);

temp=P[x][y];while (temp !=y) {

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

temp=P[temp][y];

}

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

printf("");

}

}

}int main(void)

{intVerNum, EdgNum, i;int** metrixD, **P;

printf("Enter the number of vertices and edges:");

scanf("%d%d", &VerNum, &EdgNum);

metrixD= (int**)malloc(VerNum * sizeof(int));

P= (int**)malloc(VerNum * sizeof(int));for (i = 0; i < VerNum; ++i) {

metrixD[i]= (int*)malloc(VerNum * sizeof(int));

P[i]= (int*)malloc(VerNum * sizeof(int));

}

printf("Input vertices and weights:");

Create_metrixD_P(metrixD, P, VerNum, EdgNum);

Floyd(metrixD, P, VerNum);

Show_metrixD_P(metrixD, P, VerNum);

Show_Path(metrixD, P, VerNum);for (i = 0; i < VerNum; ++i) {free(metrixD[i]);free(P[i]);

}free(metrixD);free(P);return 0;

}

c语言 floyd优化,Floyd(弗洛伊德)算法(C语言)相关推荐

  1. 弗洛伊德算法c语言path,Floyd算法(弗洛伊德算法)

    算法描述: Floyd算法又称为弗洛伊德算法,插点法,是一种用于寻找给定的加权图中顶点间最短路径的算法.从图的带权邻接矩阵A=[a(i,j)] n×n开始,递归地进行n次更新,即由矩阵D(0)=A,按 ...

  2. 最短路径之迪杰斯特拉(Dijkstra 算法)弗洛伊德算法(C语言完整代码实现)

    写在前面:博主是一位普普通通的19届双非软工在读生,平时最大的爱好就是听听歌,逛逛B站.博主很喜欢的一句话花开堪折直须折,莫待无花空折枝:博主的理解是头一次为人,就应该做自己想做的事,做自己不后悔的事 ...

  3. 密码学:c/c 语言实现 pdf,典型密码算法C语言实现pdf

    典型密码算法C语言实现 内容简介 <典型密码算法C语言实现>详细讲述了一些典型密码算法的算法原理及C语言实现.书中密码算法包括:序列密码.分组密码.公钥密码和Hash算法,其中序列密码有祖 ...

  4. c语言循环队列入列算法,C语言——循环队列和链队列的基本运算

    // 循环队列 #include #include "SeqQue.h" // 循环队列的基本运算 /* const int maxsize = 20; typedef struc ...

  5. Floyd - Warshall(弗洛伊德算法)

    简介:Floyd算法又称为插点法,是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法,与Dijkstra算法类似.该算法名称以创始人之一.1978年图灵奖获得者.斯坦福大学计算机科学系 ...

  6. c语言禁止优化某段代码,C语言优化小技巧

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 在编写C语言程序后,经常需要对源码进行优化,以提高程序的运行效率,下面简述几个常用的优化技巧以供大家参考: 1.C于代码在程序中的优化 现在的C编译器会自 ...

  7. C语言约瑟夫报数出圈算法,c语言实现约瑟夫环问题

    (一)基本问题 1.问题描述 设有编号为1,2,-,n的n(n>0)个人围成一个圈,每个人持有一个密码m.从第一个人开始报数,报到m时停止报数,报m的人出圈,再从他的下一个人起重新报数,报到m ...

  8. c语言字符串非对称加密,RSA算法C语言实现(支持任意位密钥)

    之前分享过三种常用MD5.SHA2和AES加密算法(点这里)实现源码,前三者分别属于哈希加密和对称加密,而另一种很常用的非对称加密RSA算法实现这次分享出来.RSA算法的原理和用途大家可以网上自行搜索 ...

  9. 简单常用滤波算法c语言实现,简单常用滤波算法C语言实现

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/xiao2yizhizai/article/details/51026151 1.限幅滤波算法(程序判 ...

最新文章

  1. 7 Papers Radios | 机器人「造孩子」;谷歌裸眼3D全息视频聊天技术公开
  2. SAP IDoc 报错- Function module not allowed SPEIDOC_INPUT_DESADV1 –
  3. 开发app用户协议_兰州移动APP开发用户体验设计不应该做的事
  4. android InputStream中read()与read(byte[] b)
  5. 震撼!英伟达用深度学习做图像修复,毫无ps痕迹
  6. canvas笔记-使用canvas画圆及点阵的使用
  7. 转:[kipmi0]进程导致系统负载高
  8. 多人视频通讯常用架构Mesh/MCU/SFU
  9. php操作mysql数据_详解PHP操作MySQL数据库
  10. 渗透测试中利用社会工程学的巧妙之处
  11. 最新鑫迪自助建站系统源码V1.1完整版
  12. 软考高项 : 计算题汇总
  13. 解线性方程组的python实现(1)——高斯主元消去法
  14. h5单页,微信浏览器唤醒APP
  15. APICloud 自定义模块开发的一些坑
  16. mysql面试题1313
  17. 【操作系统】LinuxKernel-VFS虚拟文件系统 认知框架构建(super_block,inode,dentry,file)
  18. “离婚”华为后,荣耀第一胎满身伤痕
  19. ESP8266物联网台灯
  20. 将PKCS12文件转成JKS

热门文章

  1. 【探究网络安全与网络安全文化及网络安全防范】计算机网络安全现状
  2. 2020牛客暑期多校训练营(第八场)E Enigmatic Partition —— 找规律,差分上差分,有丶东西
  3. navicat 导出excel数据不全问题
  4. python拆分excel文件
  5. 计算机网络 chapter 7 网络安全
  6. android 生成多个表单,Android根据word模板文档将表单数据生成word文档的方案整理...
  7. 【MATLAB Image Processing Toolbox 入门教程三】快速入门之“在多光谱图像中寻找植被”
  8. linux系统从开机到登陆界面的启动过程
  9. 将直播链接放入微信公众号
  10. 深度学习各种优化函数详解