图的存储 —— 链式前向星

article/2025/10/16 11:56:42

图的存储 —— 链式前向星

链式前向星采用了一种静态链表存储方式,将边集数组和邻接表相结合,可以快速访问一个节点的所有邻接点,在算法竞赛中被广泛应用。

链式前向星有如下两种存储结构。

  • 边集数组:edge[],edge[i ]表示第i 条边。
  • 头节点数组:head[],head[i ]存储以i 为起点的第1条边的下标(edge[]中的下标)。
struct node{int to , next , w;
}edge[maxe]; //边集数组,对边数一般要设置比maxn x maxn 大的数,题目有要求除外
int head[maxn]; //头节点数组

每一条边的结构都如下图所示。

在这里插入图片描述

例如,一个无向图如下图所示:

在这里插入图片描述

按以下顺序输入每条边的两个端点,建立链式前向星,过程如下。

① 输入1 2 5。创建一条边1-2,权值为5,创建第1条边edge[0],将该边链接到节点1的头节点中(初始时head[]数组全部被初始化为-1)。edge[0].next=head[1]; head[1]=0,表示节点1关联的第1条边为0号边,如下图所示。

在这里插入图片描述

图中的虚线箭头仅表示它们之间的链接关系,不是指针。

因为是无向图,所以还需添加它的反向边2-1,权值为5。创建第2条边edge[1],将该边链接到节点2的头节点中。即edge[1].next=head[2]; head[2]=1;表示节点2关联的第1条边为1号边,如下图所示。

在这里插入图片描述

② 输入1 4 3。创建一条边1-4,权值为3。创建第3条边edge[2],将该边链接到节点1的头节点中(头插法)。即edge[2].next=head[1]; head[1]=2,表示节点1关联的第1条边为2号边,如下图所示。

在这里插入图片描述

因为是无向图,所以还需要添加它的反向边4-1,权值为3。创建第4条边edge[3],将该边链接到节点4的头节点中。即edge[3].next=head[4]; head[4]=3,表示节点4关联的第1条边为3号边,如下图所示。

在这里插入图片描述

③ 依次输入三条边2 3 8、2 4 12、3 4 9,创建的链式前向星如下图所示。

在这里插入图片描述

添加一条边u v w 的代码如下:

void add(int u, int v, int w){ //添加一条边edge[cnt].to = v;edge[cnt].w = w;edge[cnt].next = head[u];head[u] = cnt ++;
}

如果是有向图,则每输入一条边,都执行一次add(u ,v ,w )即可;如果是无向图,则需要添加两条边add(u ,v ,w ); add(v ,u ,w)

使用链式前向星访问一个节点u 的所有邻接点:

for(int i = head[u] ; i != -1 ; i = edge[i].next){ //i != -1 可以写为~iint v = edge[i].to;  //u的邻接点int w = edge[i].w; //u - v 的权值...
}

链式前向星的特性:

  • 和邻接表一样,因为采用头插法进行链接,所以边的输入顺序不同,创建的链式前向星也不同。
  • 对于无向图,每输入一条边,都需要添加两条边,互为反向边。例如,输入第1条边1 2 5,实际上添加了两条边,如下图所示。这两条边互为反向边,可以通过与1的异或运算得到其反向边,01=1,11=0。也就是说,如果一条边的下标为i ,则其反向边为i ^1。这个特性在网络流中应用起来非常方便。

在这里插入图片描述

  • 链式前向星具有边集数组和邻接表的功能,属于静态链表,不需要频繁地创建节点,应用起来十分灵活。

http://chatgpt.dhexx.cn/article/7yElm8Xu.shtml

相关文章

简述链式前向星

一、前言 我们常见的存图数据结构有两种,一种是邻接矩阵,另一种是邻接表。而在邻接矩阵中,空间复杂度为 O ( n 2 ) O(n^2) O(n2),在稀疏图的情况下,相较于邻接表浪费了许多空间。而常规的邻接表是用链表进行操作&…

链式前向星 详解

链式前向星 链式前向星是一种类似于邻接表的存图方式,同样适用于有向 图和无向图。 他建立的是边与边之间的联系 它将边里的所有边都进行编号 int cnt; //边的编号 struct edge{ //边的结构体int from,to,w,next; //from是边的起点(这个可有可无&a…

用链式前向星存储图

图最常用的存储结构主要是邻接矩阵和邻接表。当顶点数太大时,用二维数组表示的邻接矩阵可能超内存(MLE),而用邻接表的编码工作量较大,此时,使用vector数组或链式前向星模拟邻接表是不错的选择。因vector数组…

链表、链式前向星

讲链表的时候就卡在这里了,最短路又卡在链式前向星上了,毕竟是图论基础,觉得还是有必要写一写防止下次再懵。 链表都是头插法!!即每次我们给他插一个头。 普通链表 先初始化令head-1,idx-1. void add_tohead(int x…

链式前向星(详细讲述)

在dalao的压迫下本蒟蒻发个博客,给大家讲一下链式前向星(新手,写错了轻喷) 首先说明一点链式前向星适合于稀疏图,而邻接矩阵则更适合稠密图,所以最好看好数据范围再决策使用哪个方法,当然有些题…

链式前向星与邻接表对比

本文图片及数据 对于这样一张有向图: 输入边的顺序如下: 1 2 2 3 3 4 1 3 4 1 1 5 4 5 对于邻接表来说是这样的: 1 -> 2 -> 3 -> 5 2 -> 3 3 -> 4 4 -> 1 -> 5 5 ->^ 对于链式前向星来说是这样的&…

链式前向星存图(有图详解)

链式前向星:既然是链式那么肯定和链表相关,前向星是每次指向都向前 链式前向星存图是以边为中心,并不是以结点为中心,它记录的是边的一些属性,包括边边的id、头节点、尾结点、权值、边的指向! 边的指向是遍历图的时候需要按照一定顺序去遍历,而不能胡乱的去遍历,那么就需要这些…

链式前向星的详解

目录 1:链式前向星的概念解释 2:代码展现 链式前向星是一种非常好用的有向图存储方式,但是它的代码难度却有点大。作者在这上面花了很长的时间才弄懂。虽然有其他的博客大佬写的很好,但总感觉不太适合小白选手(比如说…

链式前向星基本原理

一、概述 我们在学习图论的时候学习了一种图的存储结构--二维数组邻接矩阵储存,他虽然可以表达直观,快速访问连接两点的边,但是它占用空间大,只适用于点少的图,所以我们需要一种能够可以存储大型图的东西--链式前向星…

链式前向星的原理图解

笔者写下这篇文章的契机是,前两天在上机课用纯链式存储写题,累的够呛。于是痛定思痛,在此梳理一遍链式前向星,也希望能给有同样困扰的同学们提供一点帮助。 在进入正题之前,我们先用邻接矩阵和邻接表引入。 邻接矩阵表…

【链式前向星+存图】讲解

大佬的链式前向星:https://blog.csdn.net/acdreamers/article/details/16902023 【前向星】&#xff1a; 解释一下&#xff1a; 【前向星和链式前向星的不同】&#xff1a; 【给出链式前向星的代码实现】&#xff1a; #include<bits/stdc.h> using namespace std; #def…

链式前向星——最完美图解

图的存储方法很多,最常见的除了邻接矩阵、邻接表和边集数组外,还有链式前向星。链式前向星是一种静态链表存储,用边集数组和邻接表相结合,可以快速访问一个顶点的所有邻接点,在算法竞赛中广泛应用。 链式前向星存储包括两种结构: 边集数组:edge[ ],edge[i]表示第i条边…

链式前向星(详解)

链式前向星&#xff08;详解&#xff09; 转自&#xff1a;传送门 我们首先来看一下什么是前向星. 前向星是一种特殊的边集数组,我们把边集数组中的每一条边按照起点从小到大排序,如果起点相同就按照终点从小到大排序, 并记录下以某个点为起点的所有边在数组中的起始位置和…

链式前向星

一 点睛 链式前向星采用了一种静态链表存储方式&#xff0c;将边集数组和邻接表相结合&#xff0c;可以快速访问一个节点的所有邻接点。 链式前向星有如下两种存储结构。 1 边集数组 edge[],edge[i] 表示第 i 条边。 2 头节点数组 head[],head[i] 存储以 i 为起点的第1条边…

深度理解链式前向星

我们首先来看一下什么是前向星. 前向星是一种特殊的边集数组,我们把边集数组中的每一条边按照起点从小到大排序,如果起点相同就按照终点从小到大排序, 并记录下以某个点为起点的所有边在数组中的起始位置和存储长度,那么前向星就构造好了. 用len[i]来记录所有以i为起点的边在数…

链式前向星(超详细)

前向星和链式前向星 链式前向星 添加边的操作 链式前向星&#xff0c;就是以链式结构来储存前向星&#xff0c;每条边就要用结构体&#xff0c;结构体中包含三个数据&#xff1a; Edge[i].to &#xff1a;第i条边的终点 Edge[i].next &#xff1a;与第i条边同一个起点的下…

stm32串口中断的接收

利用串口使得led点亮 利用之前的串口函数加上NVIC的中断函数结构体 定义结构体 定义 配置抢占优先级的组别 配置NVIC串口中断的结构体&#xff1a;中断的通道&#xff0c;配置抢占优先级和子优先级 使能CMD 结构体初始化 还有需要配置中断串口的配置&#xff1a; 串口 接…

STM32串口下载

使用FlyMCU下载程序 1.上电前&#xff0c;设置BOOT01&#xff0c;BOOT10。或者是在上电后&#xff0c;设置BOOT01&#xff0c;BOOT10之后&#xff0c;然后按一下复位按键&#xff0c;从而通过串口下载程序。 2.&#xff0c;在MDK编译加载生成的hex文件&#xff0c;并勾选右边的…

STM32 串口发送乱码问题

STM32 串口发送乱码问题 一、问题状况&#xff1a; 显示为一堆乱码&#xff0c;&#x1f4a2;&#x1f620;&#x1f4a2;晕啊 。 二、解决方法 (通常问题是出在step3:调整外部振荡器默认值) step1:检查时钟树配置 设置晶振为开发板上外部晶振一致的8MHz。 step2:检查波…

STM32串口发送和接收

采用标准库 主控STM32F103C8T6 03代码&#xff1a; #include "main.h" #include "led/led.h" #include "exit/exit.h" #include "uart/uart.h"int main() {NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);InitLED();InitExit();I…