干货分享|图论的常见存储方式之链式前向星

链式前向星

示意图

链式前向星的代码非常模板话,但是在初学截断单看代码很难理解其中的原理。

下面着重对第 1 步和第 4 步的建图进行阐述:设为 0。

选取最近未使用的边的空间,此时边号 idx=02 有一条权值为 3 的边。

选取最近未使用的边的空间,此时边号idx=0

在 idx=0 处存储入度点 2 和权值 3

将 idx=0 处 nex 位置存为 head0=-1

将 head0 更新为当前的边号 idx=0

第 4 步0, 3, 5 表示 0 到 3 有一条权值为 5 的边。

选取最近未使用的边的空间,此时边号 idx = 3

在 idx=3 处存储入度点 2 和权值 3

将 idx=3 处 nex 位置存为head0=0 (注意,这是第 1 步时,存储的值)

将 head0 更新为当前的边号 idx=3

由于 head 数组始终指向最后存储的位置。因此在遍历 headfrom 时,与存储的顺序时相反的。(而邻接表在遍历时与存储顺序一致)

聪明的读者应该已经发现了,其实链式前向星就是另一种表现形式的邻接表。

数据结构

复制代码
struct Edge {
    int to;     // 入度点
    int val;    // 权值
    int nex;    // 下一个节点
};

Edge edge[边数];
int head[点数];
int tot = 0; // 使用到了第几条边

操作

复制代码
// 添加边
void addEdge(int from, int to, int value) {
    // 根据tot的初始值确定使用的第一条边的边号
    tot += 1;
    edge[tot].to = to;
    edge[tot].val = value;
    edge[tot].nex = head[from];
    head[from] = tot;
}

// 遍历
for (int i = head[from]; /*根据head初始值作为终止条件*/; i = edge[i].nex) {
    int to = edge[i].to;
    int val = edge[i].val;
}
相关推荐
罗湖老棍子4 小时前
【例 1】Sightseeing Trip(信息学奥赛一本通- P1494)(洛谷-P10927)
数据结构·算法·图论·最短路·floyd·最小环
stsdddd6 小时前
YOLO算法建筑工地安全帽目标检测数据集16881张:标注核对笔记
算法·yolo·目标检测
CV爱数码7 小时前
论文精读|Learned Primal-Dual:把原始–对偶算法展开成网络
图像处理·算法·计算机视觉·ct·重建·断层扫描
yuniko-n7 小时前
【算法】约瑟夫环问题
java·算法
l1t8 小时前
测试DuckDB v2.1.0-alpha49002的bignum乘法
数据库·sql·算法·duckdb
Nil2088 小时前
LeetCode 283移动零
数据结构·算法·leetcode
CQU_JIAKE8 小时前
10.18【A】
算法
LMT流氓兔8 小时前
第五单元——第4课:给工具参数加校验
java·前端·算法·ai·langchain
物联网软硬件开发-轨物科技9 小时前
【轨物方案】深度解读开关柜智能感知及一键顺控专家系统
大数据·运维·网络·人工智能·算法·机器人
行者全栈架构师9 小时前
我用 TRAE Work 把桌游之夜搬进了浏览器:一个计分器的从创意到上线
前端·算法·架构