链式前向星(详解)

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

链式前向星(详解)

转自:传送门

我们首先来看一下什么是前向星.

前向星是一种特殊的边集数组,我们把边集数组中的每一条边按照起点从小到大排序,如果起点相同就按照终点从小到大排序,

并记录下以某个点为起点的所有边在数组中的起始位置和存储长度,那么前向星就构造好了.

用len[i]来记录所有以i为起点的边在数组中的存储长度.

用head[i]记录以i为边集在数组中的第一个存储位置.

那么对于下图:

我们输入边的顺序为:

1 2

2 3

3 4

1 3

4 1

1 5

4 5

那么排完序后就得到:

编号:     1      2      3      4      5      6      7

起点u:    1      1      1      2      3      4      4

终点v:    2      3      5      3      4      1      5

得到:

head[1] = 1    len[1] = 3

head[2] = 4    len[2] = 1

head[3] = 5    len[3] = 1

head[4] = 6    len[4] = 2

但是利用前向星会有排序操作,如果用快排时间至少为O(nlog(n))

如果用链式前向星,就可以避免排序.

我们建立边结构体为:

struct Edge

{

     int next;

     int to;

     int w;

};

其中edge[i].to表示第i条边的终点,edge[i].next表示与第i条边同起点的下一条边的存储位置,edge[i].w为边权值.

另外还有一个数组head[],它是用来表示以i为起点的第一条边存储的位置,实际上你会发现这里的第一条边存储的位置其实

在以i为起点的所有边的最后输入的那个编号.

head[]数组一般初始化为-1,对于加边的add函数是这样的:

void add(int u,int v,int w)
{edge[cnt].w = w;edge[cnt].to = v;edge[cnt].next = head[u];head[u] = cnt++;
}

初始化cnt = 0,这样,现在我们还是按照上面的图和输入来模拟一下:


edge[0].to = 2;     edge[0].next = -1;      head[1] = 0;

edge[1].to = 3;     edge[1].next = -1;      head[2] = 1;

edge[2].to = 4;     edge[2],next = -1;      head[3] = 2;

edge[3].to = 3;     edge[3].next = 0;       head[1] = 3;

edge[4].to = 1;     edge[4].next = -1;      head[4] = 4;

edge[5].to = 5;     edge[5].next = 3;       head[1] = 5;

edge[6].to = 5;     edge[6].next = 4;       head[4] = 6;

很明显,head[i]保存的是以i为起点的所有边中编号最大的那个,而把这个当作顶点i的第一条起始边的位置.

这样在遍历时是倒着遍历的,也就是说与输入顺序是相反的,不过这样不影响结果的正确性.

比如以上图为例,以节点1为起点的边有3条,它们的编号分别是0,3,5   而head[1] = 5

我们在遍历以u节点为起始位置的所有边的时候是这样的:

for(int i=head[u];~i;i=edge[i].next)

那么就是说先遍历编号为5的边,也就是head[1],然后就是edge[5].next,也就是编号3的边,然后继续edge[3].next,也

就是编号0的边,可以看出是逆序的.
 


http://chatgpt.dhexx.cn/article/MmFjBYCE.shtml

相关文章

链式前向星

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

深度理解链式前向星

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

链式前向星(超详细)

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

stm32串口中断的接收

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

STM32串口下载

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

STM32 串口发送乱码问题

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

STM32串口发送和接收

采用标准库 主控STM32F103C8T6 03代码: #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…

stm32串口控制LED灯

实验要求:电脑串口控制单片机的LED灯 led.c #include "led.h" #include "delay.h" /*初始化led所在口的时钟以及一些输入输出的相关设置*/void Led_Init() {GPIO_InitTypeDef GPIO_Initstructure;RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIO…

stm32串口收发总结

stm32串口的使用过程: 1.使能串口时钟,同时使能串口对应的GPIO的时钟; 2.设置串口引脚的输入输出模式、速率,并初始化GPIO引脚; 3.对于需要接收数据的串口,配置其中断,并使能; 4.设置…

STM32串口发送中断踩坑

今天想测试下Modbus设备,手上暂时没有串口转485的模块,就打算用手上的stm32f042的开发板做个串口转485模块。如下所示 但是软件实际开发过程中,遇到了麻烦。 现象: 在打开串口接收中断时,串口会一直产生除接收中断外的其它中断…

STM32串口下载程序

STM32串口连接及下载程序 一、认识STM321、浅谈STM322、TTL串口与STM3连接 二、下载程序1、HEX文件生成2、烧录软件使用 三、总结四、参考文献 一、认识STM32 1、浅谈STM32 1、STM32型号的说明:以STM32F103RBT6这个型号的芯片为例,该型号的组成为7个部分&#xff…

STM32串口收发处理

STM32串口收发 STM32的串口接收和发送方式都有三种情况,即轮询、中断和DMA,俩俩组合便有9种可能的组合。 下面挑出其中三种收发方式进行研究,以及优缺点比较。 一、中断接收、轮询发送,无缓存模式 1.1 原理 当串口上有字节传送…

STM32 串口通讯及实现

目录 一、串口通讯概述1、广义的串口2、狭义的串口3、串口数据定义4、串口通讯应用 二、STM32串口工程标准库实现1、串口的初始化2、串口数据发送.3、串口的数据接收 一、串口通讯概述 1、广义的串口 广义的串口是针对并口来说的。串口是指设备之间通过一根数据信号线按数据位…

STM32串口配置

目录 串口设置的一般步骤: 1) 串口时钟使能,GPIO 时钟使能 2) 串口复位 3) GPIO 端口模式设置 4) 数据发送与接收 5) 串口状态 6) 使能串口 7) 开启串口响应中断 8.获取相应中断状态 串口设置的一般步骤: 1) 串口时钟使能&#xff0…

STM32串口详解

实验一:简单的利用串口接收中断回调函数实现数据的返回 关于串口调试助手,还应知道: 发送英文字符需要用一个字符即8位,发送汉字需要两个字符即16位,如上图,发送汉字“姜”实际是发送“BD AA”而发送英文字…

stm32串口实验

目录 (一)STM32 串口简介 (二)软件设计 (三)效果:​ 1.实现功能:STM32 通过串口和上位机的对话, STM32 在收到上位机发过来的字符串后,原原本本的返回给上位机。 (一&…

STM32 串口乱码

问题描述 用正点原子STM32F4探索者开发板调试野火骄阳电机驱动程序,发现串口输出一直是乱码。问题排查: 串口调试助手编码方式?同一个串口调试助手,用正点原子、STM32CubeMX生成的程序发送数据正常。排除串口调试助手问题。串口…

STM32串口通信编程

重庆交通大学信息科学与工程学院 《嵌入式系统基础A》课程 实验报告(2) 班 级: 物联网工程2002 姓名-学号 : 徐权-632007060327 实验项目名称: STM32串口通信编程 实验项目性质: 设计性 实验所…

STM32串口驱动

首先了解串口通信的一些基本原理: ⚫ 串口通信: 串口通信是指数据通过一条数据线(或者两条差分线)一位接着一位的传输出去。串口通信的优点是占用硬件资源少,且传输距离较远,缺点是传输速度慢(…

STM32串口

使用百问网的STM32F103MINI开发板完成下面实验。 1、通过STM32CubeMX配置串口。 串口1选择Asynchronous,异步通信。 115200bps,8N1,默认即可。 2、串口发送数据。 STM32Cube生成代码后,在main.c的while(1)前面加一句。 HAL_U…