Dijkstra算法的优化1:用邻接表储存图(C语言实现)

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 = 
  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值