简述链式前向星

一、前言

我们常见的存图数据结构有两种,一种是邻接矩阵,另一种是邻接表。而在邻接矩阵中,空间复杂度为 O ( n 2 ) O(n^2) ,在稀疏图的情况下,相较于邻接表浪费了许多空间。而常规的邻接表是用链表进行操作,不便于打竞赛,因此大佬们在邻接表的基础上发明了这个简单易操作的结构——链式前向星

二、邻接表

因为链式前向星是由邻接表(链表)变化来的,邻接表是存储图的边集,我们简单回忆一下邻接表(具体内容不做展开):

下面是图 G 1 , G 2 G_1,G_2
在这里插入图片描述
邻接表的结点结构为:
在这里插入图片描述
上图中adjvex为邻接点,即边的终点;nextarc连接同起点的下一个结点;info存边长等信息,firstarc连接该点对应的第一条边(因为是头插法,所以为最后插入的边)。

则由 G 1 , G 2 G_1,G_2 得到的邻接表为(info域在图中省略):

在这里插入图片描述
邻接表在每次插入结点时使用头插法

三、链式前向星

在简单回忆了邻接表后,我们开始介绍竞赛中图论经常使用的存图结构——链式前向星(正文来了)。

有了邻接表的思想,链式前向星则十分容易理解,宏观上我们只需要把链表改成数组就行了,具体介绍如下:

首先我们写出链式前向星的数据结构及加边的代码:

namespace G{
	//数据结构
	int to[MAXM], head[MAXN], nxt[MAXM], tot;
	
	void AddEdge(int u, int v, int w) {//u,v,w分别为边的起点、终点和边权
		to[tot] = v;//填adjvex域
		val[tot] = w;//填info域,这里为边权
		nxt[tot] = head[u];//连接下一个结点
		head[u] = tot++;//头指针移动
	}
}

代码中to对应邻接表中的adjvex域,w对应info域,nxt对应nextarc域,head对应头指针firstarc域,加边代码功能见注释。

最后,你就可以像用链表一样使用链式前向星了,希望大家在竞赛中取得好的成绩。

猜你喜欢

转载自blog.csdn.net/weixin_44413191/article/details/107014204