目录

前言

一、Foldy代码核心介绍

二、Flody代码详解:

三、所有代码:

四、 Foldy算法分析:

总结


前言

如果你要求所有顶点至所有顶点的最短路径问题时,弗洛伊德算法是非常不错的选择。因为它十分简洁。

一、Foldy代码核心介绍

(1)  两个二维数组D[v][w] 和P[v][w],分别存最短距离和最短路径。

(2) D[v][w] = min(D[v,w] ,D[v][k]+D[k][w])

二、Flody代码详解:

/*Floyd算法,求网图G中各顶点v到其余顶点w的最短路径P[v][w]及带权长度D[v][w]*/
void ShortestPath_Floyd(MGraph G,Patharc*P,ShortPathTable* D)
{int v, w, k;/*初始化D与P*/for (v = 0; v < G.numVertexes; v++){for (w = 0; w < G.numVertexes; w++){(*D)[v][w] = G.arc[v][w];(*P)[v][w] = w;}}for (k = 0; k < G.numVertexes; k++){for (v = 0; v < G.numVertexes; v++){for (w = 0; w < G.numVertexes; w++){if ((*D)[v][w] > ((*D)[v][k] + (*D)[k][w]))/*如果v->k->w比v->w更短*/{(*D)[v][w] = (*D)[v][k] + (*D)[k][w];/*更改v->w最小值*/(*P)[v][w] = (*P)[v][k];/* 路径设置为经过下标为k的顶点 */}}}}
}

三、所有代码:

#include <iostream>
using namespace std;
#define GRAPH_INFINTY 65535
#define MAXVEX 20
#define MAXEDGE 20
typedef struct {int vexs[MAXVEX];int arc[MAXVEX][MAXVEX];int numVertexes, numEdges;
}MGraph;
typedef int Patharc[MAXVEX][MAXVEX];
typedef int ShortPathTable[MAXVEX][MAXVEX];
/*构造图*/
void CreateGraph(MGraph* G)
{int i, j;/*初始化顶点数和边数*/G->numVertexes = 9;G->numEdges = 16;/*初始化图的顶点编号*/for (i = 0; i < G->numVertexes; i++){G->vexs[i] = i;}/*初始化矩阵*/for (i = 0; i < G->numVertexes; i++){for (j = 0; j < G->numVertexes; j++){if (i == j)G->arc[i][j] = 0;elseG->arc[i][j] = GRAPH_INFINTY;}}G->arc[0][1] = 1;G->arc[0][2] = 5;G->arc[1][2] = 3;G->arc[1][3] = 7;G->arc[1][4] = 5;G->arc[2][4] = 1;G->arc[2][5] = 7;G->arc[3][4] = 2;G->arc[3][6] = 3;G->arc[4][5] = 3;G->arc[4][6] = 6;G->arc[4][7] = 9;G->arc[5][7] = 5;G->arc[6][7] = 2;G->arc[6][8] = 7;G->arc[7][8] = 4;for (i = 0; i < G->numVertexes; i++){for (j = i; j < G->numVertexes; j++){G->arc[j][i] = G->arc[i][j];}}}
/*Floyd算法,求网图G中各顶点v到其余顶点w的最短路径P[v][w]及带权长度D[v][w]*/
void ShortestPath_Floyd(MGraph G,Patharc*P,ShortPathTable* D)
{int v, w, k;/*初始化D与P*/for (v = 0; v < G.numVertexes; v++){for (w = 0; w < G.numVertexes; w++){(*D)[v][w] = G.arc[v][w];(*P)[v][w] = w;}}for (k = 0; k < G.numVertexes; k++){for (v = 0; v < G.numVertexes; v++){for (w = 0; w < G.numVertexes; w++){if ((*D)[v][w] > ((*D)[v][k] + (*D)[k][w]))/*如果v->k->w比v->w更短*/{(*D)[v][w] = (*D)[v][k] + (*D)[k][w];/*更改v->w最小值*/(*P)[v][w] = (*P)[v][k];/* 路径设置为经过下标为k的顶点 */}}}}
}
int main()
{int v, w;MGraph G;Patharc P;ShortPathTable D;CreateGraph(&G);ShortestPath_Floyd(G, &P, &D);cout << "各顶点间最短路径如下" << endl;for (v = 0; v < G.numVertexes; v++){for (w = v+1; w < G.numVertexes; w++){int j = G.vexs[v];cout << G.vexs[v] << " -> " << G.vexs[w] << " weight: "<<D[v][w]<<"  path: "<<G.vexs[v];while (j!=w){cout << " -> " << P[j][w];j = P[j][w];}cout << endl;}cout << endl;}return 0;
}

四、 Foldy算法分析:

Foldy算法其实是动态规划,他把记忆每次外循环求得的结果并一次次优化,这是和Dijkstra贪心思想的本质不同。它的时间复杂度是O(n3)。因为它求出了所有点到所有点的最短路径及距离。

总结

Foldy算法仅用三个for循环就把所有最短路径全部求出,真是非常漂亮的算法!

数据结构------最短路弗洛伊德算法(Flody)相关推荐

  1. 最短路-弗洛伊德算法狄克斯特拉算法

    最短路 1.多源最短路 定义:现有n个地点,求任意两点间的最短距离 算法:弗洛伊德(floyd)算法 思想:让每一个点成为中转点,进行"松弛"操作: 所谓松弛操作就是要搞出 A+B ...

  2. 最短路弗洛伊德算法。

    题目 N  M//接下来N行,每行X,Y,V.表示序号X到序号Y要V费. X Y V .... X Y//最后一行表示要从序号X到Y: #include<iostream> #includ ...

  3. 【数据结构】图的应用(普利姆算法、克鲁斯卡尔算法、迪杰斯特拉算法、弗洛伊德算法、拓扑排序)

    最小生成树 什么是最小生成树 是一棵树 - 无回路 - |V|个顶点一定有|V|-1条边 是生成树 - 包含全部顶点 - |V|-1条边全在图里 贪心算法 什么是"贪":每一步都要 ...

  4. 最短路弗洛伊德(Floyd)算法加保存路径

    弗洛伊德算法大致有点像dp的推导 dp[i][j] = min(dp[i][k] + dp[k][j], dp[i][j]), 其中 i 是起始点,j 是终止点.k是它们经过的中途点. 通过这个公式不 ...

  5. 数据结构:弗洛伊德算法(最短路径)图文详解

    弗洛伊德算法选取某个节点k作为i到j需要经过的中间节点,通过比较d(i,k)+d(k,j)和现有d(i,j)的大小,将较小值更新为路径长度,对k节点的选取进行遍历,以得到在经过所有节点时i到j的最短路 ...

  6. 《数据结构课设》弗洛伊德算法设计校园导游系统

    大二上学期的数据结构课设分享一下,具体题目如下: 题目27:"校园导游系统"的设计与实现 1.问题描述 设计一个校园导游系统,为来访的客人提供信息查询服务. 2.基本要求 (1)从 ...

  7. 大话数据结构-迪杰斯特拉算法(Dijkstra)和弗洛伊德算法(Floyd)

    6 最短路径   最短路径,对于图来说,是两顶点之间经过的边数最少的路径:对于网来说,是指两顶点之间经过的边上权值之和最小的路径.路径上第一个顶点为源点,最后一个顶点是终点. 6.1 迪杰斯特拉(Di ...

  8. 最短路之——弗洛伊德算法(floyd)

    来源: https://blog.csdn.net/riba2534/article/details/54562440 我们要做的是求出从某一点到达任意一点的最短距离,我们先用邻接矩阵来建图,map[ ...

  9. (王道408考研数据结构)第六章图-第四节5:最短路径之弗洛伊德算法(思想、代码、演示、答题规范)

    文章目录 一:动态规划基本思想 二:弗洛伊德(Floyd)算法基本思想 三:弗洛伊德(Floyd)算法代码实现 四:弗洛伊德(Floyd)算法代码视频演示 五:弗洛伊德(Floyd)算法代码答题规范 ...

最新文章

  1. yarn架构——本质上是在做解耦 将资源分配和应用程序状态监控两个功能职责分离为RM和AM...
  2. 模糊控制作业c语言,单片机 模糊控制 算法 c语言
  3. ng-template和ngTemplateOutlet
  4. LeetCode 1041. 困于环中的机器人
  5. (转)goldengate 复制进程replicat出现ORA-01403 错误
  6. 再谈typedef(重点为函数指针)
  7. python入门经典100题-Python基础训练100题(带答案)[DOC][47KB]
  8. 17素材网手动免费下载素材
  9. 安洵信息渗透工程师面试经验分享
  10. 光纤信号服务器,485转光纤的两种方式
  11. vtp服务器作用,VTP
  12. 上海电力大学计算机专业考研好考么,上海电力大学(专业学位)计算机技术考研难吗...
  13. 参加了iDOF2016会议,发表演讲“油田SOA与云平台的系统思考与实践”
  14. android 给图片加文字、图片水印
  15. 今天科普一下 iOS马甲包审核以及常见审核问题
  16. 中断优先级分组与抢占优先级和响应优先级的关系
  17. 读书笔记-干法-热爱工作天道酬勤
  18. 解决“Win 10 ipv6无网络权限/无Internet连接权限”问题
  19. 手机您的浏览器不允许第三方_手机壁纸:我的世界不允许你的消失,不管结局是否完美...
  20. java sbt_SBT管理java项目

热门文章

  1. Centos 8 stream x64安装KVM
  2. 选择什么样的物联网卡才靠谱?
  3. 计算机在线考试系统,高效刷题考试平台——快考题
  4. 机器学习学习中,数学最重要!
  5. optimizer.load_state_dict()
  6. 编辑器未包含main类型
  7. linux命令英文缩写的含义(方便记忆)
  8. android 9.0 10.0 USB连接模式默认设为MTP
  9. 2021青龙一中高考成绩查询,回馈师恩 永念母校——青龙一中2019届高三年级毕业典礼掠影...
  10. 多种支付渠道路由方案有哪些?