数据结构------最短路弗洛伊德算法(Flody)
目录
前言
一、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.多源最短路 定义:现有n个地点,求任意两点间的最短距离 算法:弗洛伊德(floyd)算法 思想:让每一个点成为中转点,进行"松弛"操作: 所谓松弛操作就是要搞出 A+B ...
- 最短路弗洛伊德算法。
题目 N M//接下来N行,每行X,Y,V.表示序号X到序号Y要V费. X Y V .... X Y//最后一行表示要从序号X到Y: #include<iostream> #includ ...
- 【数据结构】图的应用(普利姆算法、克鲁斯卡尔算法、迪杰斯特拉算法、弗洛伊德算法、拓扑排序)
最小生成树 什么是最小生成树 是一棵树 - 无回路 - |V|个顶点一定有|V|-1条边 是生成树 - 包含全部顶点 - |V|-1条边全在图里 贪心算法 什么是"贪":每一步都要 ...
- 最短路弗洛伊德(Floyd)算法加保存路径
弗洛伊德算法大致有点像dp的推导 dp[i][j] = min(dp[i][k] + dp[k][j], dp[i][j]), 其中 i 是起始点,j 是终止点.k是它们经过的中途点. 通过这个公式不 ...
- 数据结构:弗洛伊德算法(最短路径)图文详解
弗洛伊德算法选取某个节点k作为i到j需要经过的中间节点,通过比较d(i,k)+d(k,j)和现有d(i,j)的大小,将较小值更新为路径长度,对k节点的选取进行遍历,以得到在经过所有节点时i到j的最短路 ...
- 《数据结构课设》弗洛伊德算法设计校园导游系统
大二上学期的数据结构课设分享一下,具体题目如下: 题目27:"校园导游系统"的设计与实现 1.问题描述 设计一个校园导游系统,为来访的客人提供信息查询服务. 2.基本要求 (1)从 ...
- 大话数据结构-迪杰斯特拉算法(Dijkstra)和弗洛伊德算法(Floyd)
6 最短路径 最短路径,对于图来说,是两顶点之间经过的边数最少的路径:对于网来说,是指两顶点之间经过的边上权值之和最小的路径.路径上第一个顶点为源点,最后一个顶点是终点. 6.1 迪杰斯特拉(Di ...
- 最短路之——弗洛伊德算法(floyd)
来源: https://blog.csdn.net/riba2534/article/details/54562440 我们要做的是求出从某一点到达任意一点的最短距离,我们先用邻接矩阵来建图,map[ ...
- (王道408考研数据结构)第六章图-第四节5:最短路径之弗洛伊德算法(思想、代码、演示、答题规范)
文章目录 一:动态规划基本思想 二:弗洛伊德(Floyd)算法基本思想 三:弗洛伊德(Floyd)算法代码实现 四:弗洛伊德(Floyd)算法代码视频演示 五:弗洛伊德(Floyd)算法代码答题规范 ...
最新文章
- yarn架构——本质上是在做解耦 将资源分配和应用程序状态监控两个功能职责分离为RM和AM...
- 模糊控制作业c语言,单片机 模糊控制 算法 c语言
- ng-template和ngTemplateOutlet
- LeetCode 1041. 困于环中的机器人
- (转)goldengate 复制进程replicat出现ORA-01403 错误
- 再谈typedef(重点为函数指针)
- python入门经典100题-Python基础训练100题(带答案)[DOC][47KB]
- 17素材网手动免费下载素材
- 安洵信息渗透工程师面试经验分享
- 光纤信号服务器,485转光纤的两种方式
- vtp服务器作用,VTP
- 上海电力大学计算机专业考研好考么,上海电力大学(专业学位)计算机技术考研难吗...
- 参加了iDOF2016会议,发表演讲“油田SOA与云平台的系统思考与实践”
- android 给图片加文字、图片水印
- 今天科普一下 iOS马甲包审核以及常见审核问题
- 中断优先级分组与抢占优先级和响应优先级的关系
- 读书笔记-干法-热爱工作天道酬勤
- 解决“Win 10 ipv6无网络权限/无Internet连接权限”问题
- 手机您的浏览器不允许第三方_手机壁纸:我的世界不允许你的消失,不管结局是否完美...
- java sbt_SBT管理java项目