当前位置: 首页 > news >正文

「图::存储」链式邻接表|链式前向星(C++)

前置知识

上一节我们介绍了三种基本的存图结构:

「图」邻接矩阵|边集数组|邻接表(C++)

概述

他们各有优劣,为了综合他们的性能,

这一节我们来介绍两种以这三种结构为基础实现的高级存储结构:链式邻接表|链式前向星。

1.链式邻接表

结构

链式邻接表由一个二维表头数组head和一个边集数组e构成,

 *注意*:edges边集数组的结构详见:「图」邻接矩阵|边集数组|邻接表(C++)

表头数组head的功能类似邻接表,但它储存的并不是出边结构而是出边的编号。

一维head数组存储某个点的一系列出边编号,他们构成的二维head数组储存所有点的出边编号。

边集数组e以编号作为索引提供出边的全部信息{u,v,w}

将这两个数据结构封装成一个整体,称为chained_adjacency_list:

struct chained_adjacency_list {edges e;vector<vector<int>>head;
};

对于head[u][i]=idx;表示从u节点出发的第i条边在所有边中编号为idx

对于edges[idx]={u,v,w};编号为idx的边从u节点出发抵达v节点,边权为w

(边的序号通常时建图时读入数据时编排的。)

形象理解:

边集数组作为数据库存储全部边信息,

点集数组head悬挂了一排出边数组head[i],head[i]是第i个点的所有出边,每个head[i][j]存储第i个点的某一出边j的索引,用于对边集数组进行访问。

复杂度

空间复杂度: O(n+m)

n:节点数量

m:边数量

特点:

1.能用于各种图。

2.支持按节点访问。

3.能存储两点之间的多条边。

4.能存储边的编号。

5.先存入的先访问。

实际上链式邻接表综合了邻接表和边集数组的优点,它对邻接表的功能做了分离,使得邻接表不再存储出边的信息,而是存储边集数组的编号,以此作为索引对存储了出边信息的边集数组进行访问。

Code

struct chained_adjacency_list {edges e;vector<vector<int>>head;
};
void add(chained_adjacency_list& l) {int n; cin >> n;while (n--) {int u, v, w; cin >> u >> v >> w;l.e.push_back({ u,v,w });if(u>=l.head.size())l.head.resize(u+1);l.head[u].push_back(l.e.size() - 1);}
}
void get(const chained_adjacency_list& l) {for (const vector<int>& i : l.head)for(const int&idx:i)cout << "       " << l.e[idx].w << endl << l.e[idx].u << "------------->" << l.e[idx].v << endl;
}

2.链式前向星

结构

链式邻接表由一个一维表头数组head和一个边集数组e构成,

表头数组head只存储一个点的一个出边编号。

edge_with_next这个结构具有成员变量v,w,next;意为:这条边抵达v,边权为w,与其出发点相同的下一条边编号为next。你会发现它模拟了链表结构,即一个边单元存储着下一个边单元的next索引,依靠这个索引访问e中的下一条边。(这里的下一条是指出发点同为v的下一边)

边集数组e由edge_with_next构成数组,存储了全部出边信息。

将这两个数据结构封装成一个整体,称为chained_foward_star:

struct edge_with_next {int v;int w;int next;
};
using edges_with_next = vector<edge_with_next>;
struct chained_foward_star {edges_with_next e;vector<int>head;
};

对于head[u]=idx;表示从u节点出发的首条边在所有边中编号为idx

对于edges[idx]={v,w,next};编号为idx的边抵达v节点,边权为w,与其出发点相同的下一条边编号为next

(边的序号通常时建图时读入数据时编排的。)

形象理解:

边集数组作为数据库存储全部出边信息{v,w,next},

点集链表head悬挂一排链表,head[i]为一张链表的链表头,同时也是第i个点的首条出边,head[i].next储存i的下一条出边。


另外,在添加i点的新边时,链式前向星会将链表头head[i]更新为该边,同时该边的next会指向曾经的head[i],也就是说存边时会翻转先后顺序,即先存入的后访问。

复杂度

空间复杂度: O(n+m)

n:节点数量

m:边数量

特点:

1.能用于各种图。

2.支持按节点访问。

3.能存储两点之间的多条边。

4.能存储边的编号。

5.边能存储下一条边。(这里的下一条是指出发点同为v的下一边)

5.先存入的后访问。

实际上链式前向星的策略与链式邻接表有所不同,它的对一系列出边的悬挂并不是依靠出边数组实现,而是依靠类似链表的next指针结构相连的。

简单来说,链式邻接表依靠数组结构储存一个点的一系列出边;链式前向星依靠链表结构储存同一个点的一系列出边。

Code

struct edge_with_next {int v;int w;int next;
};
using edges_with_next = vector<edge_with_next>;
struct chained_foward_star {edges_with_next e;vector<int>head;
};
void add(chained_foward_star& star) {int n; cin >> n;while (n--) {int u, v, w; cin >> u >> v >> w;if (u >= star.head.size())star.head.resize(u + 1, -1);star.e.push_back({ v,w,star.head[u] });star.head[u] = star.e.size() - 1;}
}
void get(const chained_foward_star& star) {for (int i = 1; i < star.head.size();i++) {int idx = star.head[i];while (idx != -1) {cout << "       " << star.e[idx].w << endl << i << "------------->" << star.e[idx].v << endl;idx = star.e[idx].next;}}
}

测试Code

/*
11
1 2 20
2 1 30
2 0 30
4 3 100
8 9 60
9 7 40
3 6 50
5 6 20
7 8 15
2 4 30
1 3 5
以上为测试用例
*/
int main() {int test; cin >> test;switch (test) {case 4: {chained_adjacency_list cl;cout << "------------input------------" << endl;add(cl);cout << "------------output-----------" << endl;get(cl);break;}case 5: {chained_foward_star star;cout << "------------input------------" << endl;add(star);cout << "------------output-----------" << endl;get(star);break;}}return 0;
}

总结

相关文章:

「图::存储」链式邻接表|链式前向星(C++)

前置知识 上一节我们介绍了三种基本的存图结构&#xff1a; 「图」邻接矩阵|边集数组|邻接表&#xff08;C&#xff09; 概述 他们各有优劣&#xff0c;为了综合他们的性能&#xff0c; 这一节我们来介绍两种以这三种结构为基础实现的高级存储结构&#xff1a;链式邻接表|…...

《Cloud Native Data Center Networking》(云原生数据中心网络设计)读书笔记 -- 10数据中心中的BGP

本章解答以下问题&#xff1a; ASN&#xff0c;团体&#xff08;community&#xff09;&#xff0c;属性&#xff08;attribute&#xff09;&#xff0c;最佳路径这些BGP术语是什么疑似&#xff1f;在数据中心中应该使用eBGP还是iBGP?在数据中心使用BGP时&#xff0c;应采用什…...

unity游戏开发——标记物体 一目了然

Unity游戏开发:标记物体,让开发变得一目了然 “好读书&#xff0c;不求甚解&#xff1b;每有会意&#xff0c;便欣然忘食。” 本文目录&#xff1a; Unity游戏开发 Unity游戏开发:标记物体,让开发变得一目了然前言1. 什么是Tag&#xff1f;2. Unity中如何添加和管理Tag步骤1&am…...

vue 项目打包图片没有打包进去问题解决

解决方法1.在导入图片的文件中通过 import 引入图片 这种方法只适合图片少的情况 <template> <img :srctestImg/> </template> <script> import testImg from /assets/img/testImg.png </script>2.封装公共方法,通过 new URL() 的方式…...

TCP的传输速度

如何确定TCP最大传输速度&#xff1f; TCP 的传输速度&#xff0c;受限于发送窗⼝&#xff0c;接收窗⼝以及⽹络设备传输能⼒。 其中&#xff0c;窗⼝⼤⼩由内核缓冲区⼤⼩决定。如果缓冲区与⽹络传输能⼒匹配&#xff0c;那么缓冲区的利⽤率就达到了最⼤化。 如何计算网络传…...

直播间的“骆驼”比沙漠还多?刀郎演唱会惊现“骆驼”

“送战友&#xff0c;踏征程&#xff0c;默默无语两行泪&#xff0c;耳边响起驼铃声……”8月30日&#xff0c;刀郎知交线上演唱会在微信视频号直播。一曲《驼铃》&#xff0c;勾起了无数人的回忆&#xff0c;离别的伤感、人性的关怀与温暖&#xff0c;通过悠然的旋律流入千万听…...

Android Studio gradle下载太慢了!怎么办?(已解决)

Android Studio&#xff01;你到底干了什么&#xff1f;&#xff01; 不能高速下载gradle&#xff0c;我等如何进行app编程&#xff1f;&#xff01; 很简单&#xff0c;我修改gradle地址不就是了。 找到gradle-wrapper.properties文件 修改其中distributionUrl的地址。 将 ht…...

安卓版Infuse来了 打造自己的影视墙

如何让安卓设备上的视频播放更高效&#xff1f;AfuseKt 或许能给出答案 AfuseKt 是一款功能强大的安卓网络视频播放器&#xff0c;专为满足用户对多样化媒体播放需求而设计。它不仅支持多种流行的在线存储和媒体管理平台&#xff0c;如阿里云盘、Alist、WebDAV 和 Emby 等&…...

【Python时序预测系列】高创新模型:基于xlstm模型实现单变量时间序列预测(案例+源码)

这是我的第351篇原创文章。 一、引言 LSTM在1990年代被提出&#xff0c;用以解决循环神经网络&#xff08;RNN&#xff09;的梯度消失问题。LSTM在多种领域取得了成功&#xff0c;但随着Transformer技术的出现&#xff0c;其地位受到了挑战。如果将LSTM扩展到数十亿参数&#…...

Ubuntu 22.04 系统中 ROS2安装

Ubuntu 22.04 系统中 ROS2安装 ROS2安装 # 多窗口终端工具 sudo apt update sudo apt install tilix打开软件&#xff0c;点击右上角图标进入设置 -> General -> size120, columns:48Command -> 勾选第一个 Run command as login shellColor -> Theme Color 选择…...

Vue内置指令v-once、v-memo和v-pre提升性能?

前言 Vue的内置指令估计大家都用过不少&#xff0c;例如v-for、v-if之类的就是最常用的内置指令&#xff0c;但今天给大家介绍几个平时用的比较少的内置指令。毕竟这几个Vue内置指令可用可不用&#xff0c;不用的时候系统正常跑&#xff0c;但在对的地方用了却能提升系统性能&…...

OpenHarmony轻松玩转GIF数据渲染

OpenAtom OpenHarmony&#xff08;以下简称“OpenHarmony”&#xff09;提供了Image组件支持GIF动图的播放&#xff0c;但是缺乏扩展能力&#xff0c;不支持播放控制等。今天介绍一款三方库——ohos-gif-drawable三方组件&#xff0c;带大家一起玩转GIF的数据渲染&#xff0c;搞…...

torch.clip函数介绍

PyTorch 中,torch.clip函数用于对张量中的元素进行裁剪,将其值限制在指定的范围内。 一、函数语法及参数解释 torch.clip(input, min=None, max=None, out=None) input:输入张量,即要进行裁剪的张量。min(可选):裁剪的下限。如果未指定,则不进行下限裁剪。max(可选)…...

西北工业大学oj题-兔子生崽

题目描述&#xff1a; 兔子生崽问题。假设一对小兔的成熟期是一个月&#xff0c;即一个月可长成成兔&#xff0c;每对成兔每个月可以生一对小兔&#xff0c;一对新生的小兔从第二个月起就开始生兔子&#xff0c;试问从一对兔子开始繁殖&#xff0c;一年以后可有多少对兔子&…...

【Go语言成长之路】 模糊测试

文章目录 模糊测试一、前提二、创建项目三、添加待测试代码四、添加单元测试五、添加模糊测试 模糊测试 ​ 本教程介绍了 Go 中模糊测试的基础知识。通过模糊测试&#xff0c;随机数据会针对您的测试运行&#xff0c;以尝试找到漏洞或导致崩溃的输入。可以通过模糊测试发现的漏…...

异或运算的高级应用和Briankernighan算法

本篇文章主要回顾一下计算机的位运算&#xff0c;处理一些位运算的巧妙操作。 特别提醒&#xff1a;实现位运算要注意溢出和符号扩展等问题。 先看一个好玩的问题&#xff1a; $Problem1 $ 黑白球概率问题 袋子里一共a个白球&#xff0c;b个黑球&#xff0c;每次从袋子里拿…...

音视频入门基础:WAV专题(9)——FFmpeg源码中计算WAV音频文件每个packet的duration和duration_time的实现

一、引言 从文章《音视频入门基础&#xff1a;WAV专题&#xff08;6&#xff09;——通过FFprobe显示WAV音频文件每个数据包的信息》中我们可以知道&#xff0c;通过FFprobe命令可以显示WAV音频文件每个packet&#xff08;也称为数据包或多媒体包&#xff09;的信息&#xff0…...

AI写的论文查重率高吗?分享6款实测AI论文生成免费网站

在当今学术研究和论文写作领域&#xff0c;AI技术的迅猛发展为研究人员提供了极大的便利。特别是AI论文自动生成助手&#xff0c;它们不仅能够提高写作效率&#xff0c;还能帮助生成高质量的论文内容。以下是六款经过实测且免费的AI论文生成网站推荐&#xff1a; 一、千笔-AIP…...

【专题】2024年8月中国企业跨境、出海、国际化、全球化行业报告汇总PDF合集分享(附原数据表)

原文链接&#xff1a; https://tecdat.cn/?p37584 在全球化浪潮汹涌澎湃的当下&#xff0c;中国企业积极探索海外市场&#xff0c;开启了出海跨境的新征程。本报告合集旨在全面梳理出海跨境全球化行业的发展态势&#xff0c;涵盖多个领域的深度洞察。 从游戏、快消品、医疗器…...

[算法]单调栈解法

目录 739. 每日温度 - 力扣&#xff08;LeetCode&#xff09; 42. 接雨水 - 力扣&#xff08;LeetCode&#xff09; 84. 柱状图中最大的矩形 - 力扣&#xff08;LeetCode&#xff09; 739. 每日温度 - 力扣&#xff08;LeetCode&#xff09; 解法&#xff1a; 通常是一维数…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销&#xff0c;平衡网络负载&#xff0c;延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

【入坑系列】TiDB 强制索引在不同库下不生效问题

文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

STM32+rt-thread判断是否联网

一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

基于服务器使用 apt 安装、配置 Nginx

&#x1f9fe; 一、查看可安装的 Nginx 版本 首先&#xff0c;你可以运行以下命令查看可用版本&#xff1a; apt-cache madison nginx-core输出示例&#xff1a; nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

PL0语法,分析器实现!

简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...

多模态大语言模型arxiv论文略读(108)

CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题&#xff1a;CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者&#xff1a;Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...

Java 二维码

Java 二维码 **技术&#xff1a;**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...

【Java学习笔记】BigInteger 和 BigDecimal 类

BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点&#xff1a;传参类型必须是类对象 一、BigInteger 1. 作用&#xff1a;适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...

Webpack性能优化:构建速度与体积优化策略

一、构建速度优化 1、​​升级Webpack和Node.js​​ ​​优化效果​​&#xff1a;Webpack 4比Webpack 3构建时间降低60%-98%。​​原因​​&#xff1a; V8引擎优化&#xff08;for of替代forEach、Map/Set替代Object&#xff09;。默认使用更快的md4哈希算法。AST直接从Loa…...

【 java 虚拟机知识 第一篇 】

目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...