链式前向星原理、实现及BFS,DFS和Dijkstra算法

链式前向星原理、实现及BFS,DFS和Dijkstra算法前言链式前向星的原理链式前向星的实现如何用链式前向星存无向图BFSDFSDijkstra前言我在学习图的时候,接触到链式前向星这个数据结构,看了很多CSDN上的博客,非常感谢博主们的贡献,但是感觉他们写的其实大同小异,而且他们大多只说了它的用处及实现,没有很清楚地说到链式前向星的原理,也就是为什么要这样构造,为什么这样构造可以work,...
摘要由CSDN通过智能技术生成

前言

我在学习图的时候,接触到链式前向星这个数据结构,看了很多CSDN上的博客,非常感谢博主们的贡献,但是感觉他们写的其实大同小异,而且他们大多只说了它的用处及实现,没有很清楚地说到链式前向星的原理,也就是为什么要这样构造,为什么这样构造可以work,而且可能他们习惯了C风格的命名方式使得别人更加难以根据变量名去理解这个结构。
而我在问了大神,用了链式前向星做BFS,DFS,还有dijkstra算法之后才真正明白为什么链式前向星要这样构造,所以分享出来给大家。因为也是刚入门数据结构,有问题请大家轻拍。

链式前向星的原理

一如在_Gion写的链式前向星笔记及别人写的博客里面说到的,链式前向星是用来存图的。但是他们好像并没有很清楚说明它的原理,所以我想说说它的原理。
链式前向星最基本的是用来存有向图的,当然稍作改造就可以存无向图了。
先附上基本的代码:

//假定所有node和edge的编号从1开始,所以数组都要加多一个元素
struct Edge{
	int nextEdgePosition;
	int toNodePosition;
	int weight;//权重
	}

Node nodes[nodeNum+1];//图中的所有结点
Edge edges[edgeNum+1];//用来记录图中的所有边
heads[nodeNum+1];//用来记录每一个节点的第一条边在edges里的位置

以上代码是链式前向星的基础。
其实链式前向星只是一个复合的结构,一个edges数组完全可以用三个数组代替,即:

int nextEdgePositons[edgeNum+1];
int toNodePostions[edgeNum+1];
int weights[edgeNum+1];
//拆分成数组可以方便在Java里构建更快的代码
//特别是当OJ系统(特别辣鸡的)算上GarbageCollection时间时,如果用内部类Class Edge代替C中的struct Edge,GC花费的时间会多很多

前面的只是铺垫,现在才开始讲原理。
其实链式前向星的原理就是用数组去实现链表(完结撒花!)

具体是什么意思呢?
回想存图的时候用的邻接表,它是用链表实现的,这个博客有很形象的表示
转图如下
在这里插入图片描述

而链式前向星里的heads数组就是存的是每一个节点的第一条边在edges数组里的位置,即

Edge firstEdgeOfOneNode = heads[oneNode];//oneNode指某个节点的编号。

那我们要怎么获得某节点第一条边的下一条边存在edges数组的哪里呢?

Edge nextEdge = edges[firstEdgeOfOneNode.nextEdgePostion];
//同理可以按顺序获得某个节点的所有出度(也就是指向其他节点的边)
//如果我们知道了某个节点的编号为nodeIdx&
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值