Dijkstra算法的优化主要体现在两个方面:
1、使用邻接表代替邻接矩阵,这样每次更新distance数组时,读取到的点都是与minIndex直接连接的点,而不用读取不直接连接的点。这样做的效率显然比较高。
2、用优先级队列代替遍历方式寻找距离源点最近的点。时间复杂度从O(N) 降低为O(logN)。
为了让读者更加容易接受,我们将分段实现优化。我们先用邻接表对Dijkstra算法进行优化。之后再加上优先级队列 (堆) 优化。为了简单起见,Dijkstra算法的优化代码不输出具体路径。
用邻接表储存图的Dijkstra算法:
用邻接表代替邻接矩阵,其实就是把图的储存方式换了一下。当然,这样操作之后,Dijkstra算法中读取边长的代码也就会有相应的改动,但是这些改动是很小的。
#include <stdio.h>
#include <stdlib.h>
int size = 6; //一共6个点的地图
int inf = 999; //无穷大
int distance[6]; //一维数组,记录距离
int book[6]; //标记每一个点是否是确定值
//声明链表结点的结构体
struct LinkNode{
int index = 0;
int weight = 0;
struct LinkNode * next = NULL;
};
//声明数组元素的结构体
struct ArrayNode{
struct LinkNode * next = NULL; //指向链表
};
//用一个数组存放首元素。每个首元素后面用指针连接各个结点
struct ArrayNode arrNode[6]; //这是地图
//头插法。得到的结果的次序是反的
void addNode(int parentIndex, int nodeIndex, int weight)
{
struct ArrayNode * currentNode;
currentNode = &arrNode[parentIndex];
//向操作系统申请空间
struct LinkNode * temp = (struct LinkNode *)(malloc(sizeof(struct LinkNode)));
temp->index =