Code前端首页关于Code前端联系我们

最短路径 - 弗洛伊德算法(Floyd)和C/C++语言代码实现

terry 2年前 (2023-09-27) 阅读数 72 #数据结构与算法

1.算法介绍

弗洛伊德算法和Dijkstra算法被公认为最著名的两种最短路径求解算法。接下来介绍一下弗洛伊德的算法。 弗洛伊德算法的思想是:先初始化距离矩阵,然后从第一个点开始逐步更新矩阵的点值。 d[i][j]表示i点到j点的距离。第k次更新时,选择d[i][k]+d[k][j]和d[i][j]大小。如果前者较小,则更新该值,否则保持不变。

这个算法的核心点就是记录每一个点我们要努力到达每一个点

最短路径——弗洛伊德(Floyd)算法及C语言/C++代码实现

(看图,尝试用这张图来搭建)

2.算法实现:

通过权重矩阵找到图上每两点之间最近的距离矩阵。

从图的加权邻接矩阵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)称为图的距离矩阵。同时,还可以引入后继节点矩阵路径来记录两点之间的距离。最短路径。

使用松弛技术(松弛操作)对i和j之间的所有其他点进行松弛。所以时间复杂度为O(n^3);

状态转移方程

状态转移方程如下:map[i,j]:=min{map[i,k]+map[k,j] ,map[i,j]};

map[i,j]显示i到j的最近距离,K是完整i,j的断点,map[n,n]的初始值必须为0或自定义特殊意义点

3。代码实现

参考代码,简化了输入操作和直接赋值。

#include #include #define MAXVEX 9#define INFINITY 65535♶❀♶❀ MGraph { int numVertexes; int

int *vex;  

int 弧[MAXVEX] [ MAXVEX];}; typedef inttypedef int][MAXV EX];typedef int ShortPathTable[MAXVEX][MAXVEX]; void❀ ❀ ❀ h *G,路径矩阵 *P,短路径路径表 *D) { int v,w,k; //初始化 ❀对于❀对于

对于❀

for ;++v) { for(w=0; wnumVertexes; ++w) { [v ][v]w]; (*P)[v][w]=w; } }♿}♿ 为 (k =0 ; knumVertexes; ++k) { (w=0; wnumVertexes; ++w) {if((*D)[v][w]>(*D)[v][k]+(*D)[k][w] ) { //(v 到 w 的距离) VS (v 到 k 的距离 + k 到 w 的距离)                     (*D)[v][w]=(*D)[v][k]+(*D)[k ] [w];         (*P)[v][w]=(*P)[v][k]; // 如果从v开始,想去w,则需要从v开始到k,“make next step(下一步(* P)​​​​[k] [w])”                        } }}} main() { MGraph *my_g=(struct) MGraph*) malloc(大小(结构MGraph)); int i,j ; int t=0; v0=0; t=0;=8; my_g->numVertexes=MAXVEX; malloc(大小(char)*my_g->数字♿(!my_) g->vex) (!my_g- >vex) return ; for(i=0; inumVertexes; ++i) (e) 每个维度//一个0,1,2,3 ,4,5, 6 ,7,8} my_g->vex[i]=i++; (对我来说 0;我numVertexes; ++i) for(j=0; jnumVertexes; ++j) TYmy_g [; ->arc=INF_g] //无向图的二维权重集合是对称矩阵 my_g][1]'1;– my_g- >arc[0 ][2]=5; my_g->arc[1][2]=3; my_g->arc[1][3]=7 ; my_g->弓[1][4]=5; my_g->弓[2][4]=1; 2][5]=7 ;my_g->弓[3][4]=2;my_g->弓[3][6]=3; my_g->弧[4][5]=3; my_g->弧[4][6]=6; ❀>弧][7 ]=9; my_g->arc[5][7]=5; my_g->arc[6][7]=2; ❿ i my_g->numVertexes ; ++i) 对于(j=0; j [i] [j] = 0; 继续}} my_g->arc[i][j]=my_g->arc[j][i];                                            ; ++i) { // 表示图中节点之间连接边的权重的二维数组 for(j=0; j ++j ) printf("%5d",my_g->arc[i][j]); printf("\n");}❀♽♶( "\n\n" );} 路径矩阵 D; 短路径表 P;,F_my ,F_my &D); i =0; i

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

热门