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

C++中邻接矩阵、邻接表、链式前向星具体用法及讲解

图论在提高组中几乎占据半壁江山,而今天要讲的就是如何存储一个图


一.邻接矩阵

  1. 原理

要建立一个图,根本的要素就是边和点

而想要让计算机存储边和点

就需要用到一些数据结构


邻接矩阵是最简单的

他使用了一个二维数组,来表示一个图

假设数组名为map

那么map[i][j]的值就代表i到j的权值

栗子例子:

一个普通的图

注意:一个无向边等于两个有向边,比如1到2权值为1

那么就相当于1->2一条有向边加上2->1一条有向边

一共两条


回归到这个图上

在这里用邻接矩阵的写法就是:

map[1][2]= 3

map[2][1]= 3

map[2][3]= 6

map[3][2]= 6

map[1][3]= 5

map[3][1]= 5

map[5][3]= 2

map[3][5]= 2

map[1][5]= 4

map[5][1]= 4

10条有向边

邻接矩阵原理就是这么简单


代码:

int n,m,vis[100001],mapa[1001][1001],ans=1000000001;
n点 m边 vis点的状态 mapa邻接矩阵二维数组 ans遍历最短距离
int main()
{cin>>n>>m;int i,j,a,b,c;memset(mapa,0x3f,sizeof(mapa));for(j=0;j<m;j++){cin>>a>>b>>c;mapa[b][a]=c;//保证单向 mapa[a][b]=c;}vis[1]=1;dfs(1,0);cout<<ans<<endl;return 0;
}
主函数部分
v[i]=1表示这个点已经走过
void dfs(int x,int dis)
{int i;if(dis>ans)//小剪枝 return;if(x==n){ans=min(ans,dis);return;}for(i=1;i<=n;i++) //不一定向前走,可能绕一下更近 if(mapa[x][i]!=0x3f3f3f3f&&vis[i]==0) {vis[i]=1;dfs(i,dis+mapa[x][i]);vis[i]=0;} 
}

dfs主体函数,基础

例题:

暑假小马想到小张家里去玩,他们住在不同的城市,这是小马第一次去小张家,小马提前在百度地图上面查找行车路线,输入出发城市和目的城市,百度地图计算出最短路径,请实现百度地图计算最短路径的方法。备注:总共有n个(n<=100)城市,小马家所在城市编号为1,小张家所在城市编号为n,公路为双向车道。
输入
第一行两个整数,分别表示城市数量n和公路数量m。
后面m行表示公路情况,每一行三个整数a,b,c,分别表示从城市a到城市b,两个城市之间的公路路程c公里。

输出
最短路程公里数
样例输入1
5 8
1 2 2
1 5 10
2 3 3
2 5 7
3 1 4
3 4 4
4 5 5
5 3 3
样例输出1
7

纯属的模板

其实这题严格来说是最短路径问题

但用来练习邻接矩阵绝对是不二之选

特点及优劣:

优:实在好理解 简单易懂

劣:除了好理解全是劣势 时间复杂度、空间复杂度等等





二.邻接表

邻接表确实有些复杂,但性能还是不错的

1.原理

以点为单位,记录每个点连接的边

数据结构:vector动态数组,动态数组好处就是不需要预估大小,但是会占一些空间

普通小图

首先:与1连接的边共有两条,链表中大概就是这样:

如果没太看懂

没关系

蒟蒻用铅笔画了一下整个过程

就是把n个点看成n个容器,每个容器往里面扔元素

一个元素含义就是一条边,如:1容器中扔了个2,代表1、2之间有边

每个往里面扔的元素,需要有两个参数

第一:边的目标点,也就是例子中的2

第二:边权值


2.代码

int main()
{node t;cin>>n>>m;int i,j,a,b,c;//memset(mapa,0x3f,sizeof(mapa));//初始化for(j=0;j<m;j++){cin>>a>>b>>c;t.v=b;t.w=c;e[a].push_back(t);t.v=a;t.w=c;e[b].push_back(t);}vis[1]=1;dfs(1,0);cout<<ans<<endl;return 0;
}
e代表容器,因为是vector,一个变量就可以扔无数个元素,所以想要每个点都有只需要一维即可
其他变量名称同邻接矩阵
void dfs(int x,int dis)
{int i;if(dis>=ans)//小剪枝 return;if(x==n){ans=min(ans,dis);return;}node tt; for(int i=0;i<e[x].size();i++){tt=e[x][i];if(vis[tt.v]==0){vis[tt.v]=1;dfs(tt.v,dis+tt.w);vis[tt.v]=0;}} 
}
就是邻接矩阵的处理上改了一些,但优化了很多很多
struct node
{int v;int w;
};vector<node> e[105];
自定义部分,vector动态数组

案例依旧是邻接矩阵的1816

3.特点及优劣:

优:解决了时间的问题以及空间的问题

劣:动态数组还是有些差


三。链式前向星

前两个你都不会也没事儿,这个一定要会

1.原理

以边为单位,记录每一条边的目标点,以及权值和下一条边的编号

(1)目标点:还是那个例子1和2之间边权值为3

目标点就为2

(2)权值:不解释了

(2)下一条边的编号:

!!!

链式前向星核心思路来了

链式前向星,顾名思义有链表的成分所在

每条边都有自己的编号

通过编号,层层遍历

还得有一个数组表示以i点为起始点的边的编号

还是画一下

基本思路就是这么个思路,代码也算是比较抽象一些,但懂了之后也很简单


2.代码

int main()
{cin>>n>>m;int i,j,a,b,c;for(j=0;j<m;j++){cin>>a>>b>>c;addedge(a,b,c);加边操作,一条无向边等于两条有向边addedge(b,a,c);}vis[1]=1;dfs(1,0);cout<<ans<<endl;return 0;
}
void addedge(int u,int v,int w)
{cnt++;边的数量e[cnt].to=v;目标点初始化e[cnt].w=w;权值e[cnt].nxt=h[u];下一条边的编号h[u]=cnt;以u为起点的边的编号更新
}
struct edge
{int to;int w;int nxt;
}e[300]; 
int cnt;
int h[105];
int n,m,vis[100001],mapa[1001][1001],ans=1000000001;
void dfs(int x,int dis)
{int i;if(dis>=ans)//小剪枝 return;if(x==n){ans=min(ans,dis);return;}for(int i=h[x];i>0;i=e[i].nxt)链式前向星遍历方法,h[x]代表以x为起始点的最新的边,只要i还是正数,i作为编号就变成第k条边的下一条边的编号{int to=e[i].to;int w=e[i].w;if(vis[to]==0){vis[to]=1;dfs(to,dis+w);vis[to]=0;}}}

  1. 特点及优劣

优:时间空间双重解决

劣:需要提前知道边的数量,来定义数组,否则就得用邻接表





以上就是本蒟蒻对邻接矩阵,邻接表,链式前向星的理解了

总结:

邻接矩阵基本没用

有边的数量就用链式前向星,否则就邻接表

看了这么多,点个赞再走才是好习惯doge

相关文章:

C++中邻接矩阵、邻接表、链式前向星具体用法及讲解

图论在提高组中几乎占据半壁江山&#xff0c;而今天要讲的就是如何存储一个图一.邻接矩阵原理要建立一个图&#xff0c;根本的要素就是边和点而想要让计算机存储边和点就需要用到一些数据结构邻接矩阵是最简单的他使用了一个二维数组&#xff0c;来表示一个图假设数组名为map那…...

appium的安装详解

安装appium 爬虫手机APP需要实现自动化&#xff0c;所以要使用appnium来实现点击&#xff0c;输入&#xff0c;滑动等操作。由于appnium的安装较为繁琐&#xff0c;所以特意整理一篇文章来展示安装的详细过程过程中。 安装appnium共有3个步骤 安装 Android SDK安装 JDK安装 …...

STM32之 串口

串口通信串行接口简称串口&#xff0c;也称串行通信接口或串行通讯接口&#xff08;通常指COM接口&#xff09;&#xff0c;是采用串行通信方 式的扩展接口。串行接口&#xff08;Serial Interface&#xff09;是指数据一位一位地顺序传送。其特点是通信线路简 单&#xff0c;只…...

CSDN 编程竞赛三十三期题解

竞赛总览 CSDN 编程竞赛三十三期题解&#xff1a;比赛详情 (csdn.net) 竞赛题解 题目1、奇偶排序 给定一个存放整数的数组&#xff0c;重新排列数组使得数组左边为奇数&#xff0c;右边为偶数&#xff08;奇数和偶数的顺序根据输入的数字顺序排列&#xff09;。 第七期竞赛…...

逆向练习之 mingyue.exe wp

目录 一.查壳 二.主函数 三.operate函数 四.storage函数及4618和4620指针功能的解释 五.judge函数 六.求解flag 七.其他--ida字符识别问题 一.查壳 64位无壳 二.主函数 1.这里的pointer_4618和4620是两个相邻的八字节内存单元,其中4620是字符串链表表头head 2.puts和s…...

LeetCode 热题 HOT 100 Java 题解 -- Part 3

练习地址 Part 1 : https://blog.csdn.net/qq_41080854/article/details/128829494 Part 2 : https://blog.csdn.net/qq_41080854/article/details/129278336 LeetCode 热题 HOT 100 Java 题解 -- Part 376. 最佳买卖股票时机含冷冻期77. 戳气球78. 零钱兑换79. 打家劫舍 III…...

QML键盘事件

在QML中&#xff0c;当有一个按键按下或释放时&#xff0c;会产生一个键盘事件&#xff0c;将其传递给获得有焦点的QML项目&#xff08;讲focus属性设置为true&#xff0c;则获得焦点&#xff09;。 按键处理的基本流程&#xff1a; Qt接收密钥操作并生成密钥事件。如果 QQuic…...

跨域问题怎么解决

解决跨域&#xff0c;原因&#xff1a;域名不同&#xff0c;域名相同端口不同&#xff1b;二级域名不同 什么是跨域&#xff1f; 就是两个项目之间通讯&#xff0c;如果访问的域名与ajax访问的地址不一致情况&#xff0c;默认情况浏览器有一个安全机制。 postman不一定能测试…...

微服务网关Gateway和Zuul的区别

spring-cloud-Gateway是spring-cloud的一个子项目。而zuul则是netflix公司的项目&#xff0c;只是spring将zuul集成在spring-cloud中使用而已。 因为zuul2.0连续跳票和zuul1的性能表现不是很理想&#xff0c;所以催生了spring团队开发了Gateway项目。 Zuul&#xff1a; 使用的…...

专访华西二院吴邦华:隐私计算+AI全栈技术,构筑智慧医院建设的坚实数据底座|爱分析访谈

从IT时代步入DT时代&#xff0c;医疗大数据成为智慧医院建设的重要驱动力。经过多年信息化系统建设&#xff0c;很多医院已经积累了大量的医疗数据资源&#xff0c;但由于各业务系统间数据孤岛化严重、系统架构落后、数据缺乏深度治理等问题存在&#xff0c;导致现有数据深度及…...

《C++ Primer Plus》第18章:探讨 C++ 新标准(6)

可变参数模板 可变参数模板&#xff08;variadic template&#xff09;让您能够创建这样的模板函数和模板类&#xff0c;即可接收可变数量的参数。这里介绍可变参数模板函数。例如&#xff0c;假设要编写一个函数&#xff0c;它可接受任意数量的参数&#xff0c;参数的类型只需…...

.Net Core中使用是SQL Server的邮件发送功能

.Net Core中使用是sqlserver的邮件发送功能准备需求启用SQL Server的电子邮件功能检查和测试在.net Core中调用在sqlsrver的管理中有一个数据库邮件功能,再此可以使用sqlserver来自动发送一些邮件,但是有一些需要插入附件的邮件则需要使用程序代码来解决,下面就是使用C#来调用s…...

Nginx优化服务和防盗链

Nginx优化服务和防盗链一、长连接1、修改主配置文件2、测试3、在主配置文件添加4、验证二、Nginx第三方模块1、开源的echo模块2、查看是否成功3、加echo模块步骤4、网页测试验证三、搭建虚拟主机1、编译安装好nginx后&#xff0c;对主配置文件进行修改2、创建文件3、验证四、防…...

B树与B+树

认识了解MySQL中的B树B树引出什么是B树什么是B树B树的优点B树引出 在MySQL中,如果我们设置了主键, 那么对于该列表中的数据就有了一个索引,插入表中数据的主键值不能重复,而且不能为空. 那当我们插入数据的时候, 它是如何通过索引来判断主键值是否重复的呢? 我们想到它肯定是…...

QEMU网络配置

文章目录1. 前言2. 测试环境3. 配置步骤3.1 host 配置3.1.1 检查 host 对 TUN/TAP 和 网桥的支持情况3.1.2 网桥一端的建立&#xff1a;创建网桥设备&#xff0c;并添加 host 网卡到网桥3.1.3 网桥另一端的建立&#xff1a;TUN/TAP 配置3.2 guest 端的配置4. 参考链接1. 前言 …...

windows安装tomcat

这里写自定义目录标题tomcat官网下载安装包并解压环境变量配置启动tomcat访问http://localhost:8080/修复启动出现乱码问题tomcat官网下载安装包并解压 环境变量配置 系统环境变量新增&#xff1a; 变量名&#xff1a;CATALINA_HOME 变量值&#xff1a;tomcat的安装目录 编辑…...

刷题记录:牛客NC23051华华和月月种树 树链剖分+离线加点

传送门:牛客 题目描述: 华华看书了解到&#xff0c;一起玩养成类的游戏有助于两人培养感情。所以他决定和月月一起种一棵树。因为华华现在也是信息学高手了&#xff0c;所以他们种的树是信息学意义下的。 华华和月月一起维护了一棵动态有根树&#xff0c;每个点有一个权值。刚…...

年薪20W软件测试工程师必备的6大技能(建议收藏)

软件测试 随着软件开发行业的日益发展&#xff0c;岗位需求量和行业薪资都不断增长&#xff0c;想要入行的人也是越来越多&#xff0c;但不知道从哪里下手&#xff0c;今天&#xff0c;就给大家分享一下&#xff0c;软件测试行业都有哪些必会的方法和技术知识点&#xff0c;作…...

【存储】RAID2.0+、多路径技术、磁盘可靠性技术

RAID2.0RAID 2.0技术RAID技术发展RAID 2.0软件逻辑对象RAID 2.0基本原理硬盘域Storage Pool & TierDisk Group&#xff08;DG&#xff09;LD&#xff08;逻辑磁盘&#xff09;Chunk&#xff08;CK&#xff09;Chunk Group&#xff08;CKG&#xff09;ExtentGrainVolume &am…...

Vue 2

文章目录1. 简介2. 第一个Vue程序3. 指令3.1 判断循环3.2 操作属性3.3 绑定事件3.4 表单中数据双向绑定3.5 其他内置指令3.6 自定义指令4. 组件4.1 全局注册4.2 局部注册4.3 组件通讯4.4 单文件组件5. 组件插槽5.1 单个插槽5.2 具名插槽5.3 作用域插槽6. 内置组件6.1 component…...

golang循环变量捕获问题​​

在 Go 语言中&#xff0c;当在循环中启动协程&#xff08;goroutine&#xff09;时&#xff0c;如果在协程闭包中直接引用循环变量&#xff0c;可能会遇到一个常见的陷阱 - ​​循环变量捕获问题​​。让我详细解释一下&#xff1a; 问题背景 看这个代码片段&#xff1a; fo…...

Go 语言接口详解

Go 语言接口详解 核心概念 接口定义 在 Go 语言中&#xff0c;接口是一种抽象类型&#xff0c;它定义了一组方法的集合&#xff1a; // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的&#xff1a; // 矩形结构体…...

MMaDA: Multimodal Large Diffusion Language Models

CODE &#xff1a; https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA&#xff0c;它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构&#xf…...

postgresql|数据库|只读用户的创建和删除(备忘)

CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

React---day11

14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store&#xff1a; 我们在使用异步的时候理应是要使用中间件的&#xff0c;但是configureStore 已经自动集成了 redux-thunk&#xff0c;注意action里面要返回函数 import { configureS…...

离线语音识别方案分析

随着人工智能技术的不断发展&#xff0c;语音识别技术也得到了广泛的应用&#xff0c;从智能家居到车载系统&#xff0c;语音识别正在改变我们与设备的交互方式。尤其是离线语音识别&#xff0c;由于其在没有网络连接的情况下仍然能提供稳定、准确的语音处理能力&#xff0c;广…...

Python 高效图像帧提取与视频编码:实战指南

Python 高效图像帧提取与视频编码:实战指南 在音视频处理领域,图像帧提取与视频编码是基础但极具挑战性的任务。Python 结合强大的第三方库(如 OpenCV、FFmpeg、PyAV),可以高效处理视频流,实现快速帧提取、压缩编码等关键功能。本文将深入介绍如何优化这些流程,提高处理…...

Java并发编程实战 Day 11:并发设计模式

【Java并发编程实战 Day 11】并发设计模式 开篇 这是"Java并发编程实战"系列的第11天&#xff0c;今天我们聚焦于并发设计模式。并发设计模式是解决多线程环境下常见问题的经典解决方案&#xff0c;它们不仅提供了优雅的设计思路&#xff0c;还能显著提升系统的性能…...

SQL进阶之旅 Day 22:批处理与游标优化

【SQL进阶之旅 Day 22】批处理与游标优化 文章简述&#xff08;300字左右&#xff09; 在数据库开发中&#xff0c;面对大量数据的处理任务时&#xff0c;单条SQL语句往往无法满足性能需求。本篇文章聚焦“批处理与游标优化”&#xff0c;深入探讨如何通过批量操作和游标技术提…...

统计学(第8版)——统计抽样学习笔记(考试用)

一、统计抽样的核心内容与问题 研究内容 从总体中科学抽取样本的方法利用样本数据推断总体特征&#xff08;均值、比率、总量&#xff09;控制抽样误差与非抽样误差 解决的核心问题 在成本约束下&#xff0c;用少量样本准确推断总体特征量化估计结果的可靠性&#xff08;置…...