队列优化的Bellman-Ford算法 (C语言实现)

本文探讨了如何使用队列优化Bellman-Ford算法,将时间复杂度降低,提高在稠密图中求解最短路径的效率。尽管在某些情况下时间复杂度仍为O(M * N),但其代码实现相比原始算法更为简洁,且能处理负权边。队列优化的策略结合了BFS的思想,允许节点多次进入队列,提供了一种高效的选择。
摘要由CSDN通过智能技术生成

Bellman-Ford算法是比较暴力的,对着所有边一通猛算。当被计算的图是稠密图时,

在这里插入图片描述
所以时间复杂度为O(N * M) = O(N^3)。这个时间复杂度是非常高的。那么有没有优雅、高效的计算方法呢?这就是本节要讨论的队列优化的Bellman-Ford算法。
小伙伴,你应该还记得BFS算法 (广度优先算法) 中使用队列进行优化吧,其实队列优化的Bellman-Ford算法基本上就可以认为是BFS + Bellman-Ford算法,只不过这里的图是用邻接表实现的,而且BFS算法中,一个结点最多只能被加入队列一次,但这里可以被反复加入队列。下面我们就来看完整的代码:

#include <stdio.h>
#include <stdlib.h>

int n = 6; //顶点数 
int m = 10; //边的数量 
int inf = 999; //infinite 
int distance[6]; //一维数组,记录距离 
int book[6];
int size = n;
int queue [100]; //用队列优化Bellman算法
int head = 0;//队列的头 
int tail = 0;//队列的尾 

//LinkNode是用于邻接表中,一个结点连接的其它结点。需要结点的编号、权重 
struct LinkNode{
   
	int index = 0;
	int weight = 0;
	struct LinkNode * next = NULL;
};

//声明结构体ArrayNode,用于邻接表中的数组 
struct ArrayNode{
   
	struct LinkNode * next = NULL;
};

//用一个数组存放首元素。每个首元素后面用指针连接各个结点 
struct ArrayNode arrNode[6]; //这是地图 

//distance数组的初始化。Bellman算法中的数组的初始化跟Dijkstra算法不一样,
//这里只需要对起点设置为0,其它都设置为inf 
void initDistance(int startIndex)
{
   
	for</
  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值