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</