Floyd算法数据结构c语言

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值