链表、链式前向星

article/2025/10/16 12:07:32

讲链表的时候就卡在这里了,最短路又卡在链式前向星上了,毕竟是图论基础,觉得还是有必要写一写防止下次再懵。

链表都是头插法!!即每次我们给他插一个头。

普通链表

先初始化令head=-1,idx=-1.

void add_tohead(int x) {		//向链表头插入一个元素e[idx] = x ;  //新建一个节点ne[idx] = head ;  	//新建节点的next指向原来的headhead = idx ; 	//head指向我新建的节点idx ++ ;
}

6c7d15e236b14c9ab15e8fb5784ac51a.jpeg

e数组存的是我们想要的数值或者其他的,ne数组存我们希望的顺序,若不改变则是上一个元素的下标,每次借用head指向最新的元素下标,再次加入借用head更新ne数组并再次更新head。

void remove(int x) {	//删除一个元素的后一个元素ne[x] = ne[ne[x]] ; 	//当前节点的next指向原来的next的next
}//ne数组里存的是上一个元素的下标

63f8290315fd49babca63fe4d2eba978.png

 我们将ne数组中下标为x的元素更新为下标为该元素的元素,看图解,这样我们在访问时,访问到e数组下标为x的元素后,i=ne[x],即为y,相当于我们没有删除e数组的元素而是跳过了他,使得遍历无法访问到该值。

void add(int k, int x) {   //在第k个插入的数后面添加一个元素e[idx] = x ;  //新建一个节点ne[idx] = ne[k] ; 	//新建节点的next指向原来next[k]ne[k] = idx ; 	//原来的next[k]指向新建的节点 26行和27行不能调换!idx ++ ;
}

8d4b58a5cf29422ab45533b3737e4b2a.jpeg

 新建一个e数组元素,同样地,不改变e数组而是改变ne数组(改变访问顺序),看图解,我们访问到ne[k]时,其实是访问了e[idx]即新建的元素,之后i更新为ne[idx],此时访问的是e[t],然后继续回归顺序。这样就达到了在k之后新插一个元素的要求。

for (int i = head ; i != -1 ; i = ne[i]) {cout << e[i] << " \n"[ne[i] == -1] ;}

遍历的实现。当ne[i] == -1的时候就说明已经到达链表尾部(或者也可以不初始化,中间句直接i就可以),即第一个插入的元素已进行循环,该链表已遍历。

链式前向星

最短路问题 dijkstra算法建图

struct node {int to, nex, val;   
} arr[N];
int tot = 0;
int dis[N];
bool vis[N];void add(int u, int v, int c) {    //表示u-v间有一条长度为c的路arr[++tot].to = v;arr[tot].val = c;arr[tot].nex = head[u];head[u] = tot;
}

fd45b81bd44948089d183881a7a5e758.jpeg

主要理解head[u]存的到底是什么?

head[u]存了所有以u为一个端点的边。边是怎么存的呢?我们这里用结构体数组存了每一条边,所以准确地说, head[u]存了所有以u为端点的结构体下标。

再注意一点,我们的结构体存储的真的是准确的边吗?并不是,我们只存了他的一个端点和距离,而用本该是另一个端点的位置存储了该端点的上一条边的下标。

为什么?

因为我们建图是为了之后的遍历,我们的遍历方式是选点,遍历该点的所有边找最短路,那么我们在建图的时候就应该选择可以找出一个点的所有边的方式,这就是链式前向星。此时,每条边出现/输入的顺序对结果无影响(反正是要遍历)。

最后一点注意!!题目要求是无向图的时候,我们要建双向边,上述代码建了一个单向的边,即我们把该边存入了u端点而未存入v端点,所以最好把建图函数拎出来,主函数输入一次,建两次边。


http://chatgpt.dhexx.cn/article/2IxTqnmM.shtml

相关文章

链式前向星(详细讲述)

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

链式前向星与邻接表对比

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

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

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

链式前向星的详解

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

链式前向星基本原理

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

链式前向星的原理图解

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

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

大佬的链式前向星: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…

stm32串口控制LED灯

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

stm32串口收发总结

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

STM32串口发送中断踩坑

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

STM32串口下载程序

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