Floyd算法,也被称为Floy-Warshall算法,是一种经典的图论算法,用于找出加权图中所有顶点对之间的最短路径,这中算法可以有效地处理有向图或负权的最短路径问题,同时也被用于计算有向图的传递闭包,Floyd算法利用动态规划的思想,通过逐步更新节点之间的路径长度来求解问题。
算法核心
Floyd算法使用一个二维数组dist来记录任意两个顶点之间的最短距离,开始时,dist[i][j]被初始化为图中顶点i到顶点j的边的权重,或者无穷大,然后,算法通过考虑图中所有顶点作为中间点,来逐步更新dist数组,对于每一对顶点(i,j),如果存在一个顶点k,使得从i,到k再到j的路径比已知的i到j的路径更短,那么就更新dist[i][j]
算法步骤:
1.初始化dist数组:如果顶点i和j之间存在一条边,则dist[i][j]等于该边的权重;否则,dist[i][j]设为无穷大。同时,对于每个顶点i,dist[i][i]设为0。
2.对于图中的每一个顶点k(作为中间点):对于每一对顶点(i, j):如果dist[i][k] + dist[k][j]小于dist[i][j],则更新dist[i][j]为dist[i][k] + dist[k][j]。
3.经过上述步骤后,dist[i][j]将包含从顶点i到顶点j的最短路径的权重。
优
优点:
可以计算图中所有顶点对之间的最短路径。
可以处理带有负权重的边。(这里为什么专门拉这个出来讲,因为Dijsktra不能处理带负权的边,相比之下Floyd算法有优势)
缺点:
时间复杂度较高,为O(n^3),其中n为顶点的数量。对于大型图,这可能会导致算法运行时间较长。
需要较大的存储空间来存储dist数组。
你的INF也可以设为其它比较大的数
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#define MAXV 100
#define INF 1000
typedef struct
{
int n, e;
int edgs[MAXV][MAXV];
}MatGraph;
int visited[MAXV] = {
0 };
void Create(MatGraph *G)
{
int l, r, w;
scanf("%d %d", &G->n, &G->e);
for (int i = 0; i < G->n; i++)
{
for (int j = 0; j < G->n; j++)
{
G->edgs[i][j