当前位置: 首页 > 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…...

ES6从入门到精通:前言

ES6简介 ES6&#xff08;ECMAScript 2015&#xff09;是JavaScript语言的重大更新&#xff0c;引入了许多新特性&#xff0c;包括语法糖、新数据类型、模块化支持等&#xff0c;显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var&#xf…...

VTK如何让部分单位不可见

最近遇到一个需求&#xff0c;需要让一个vtkDataSet中的部分单元不可见&#xff0c;查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行&#xff0c;是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示&#xff0c;主要是最后一个参数&#xff0c;透明度…...

鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/

使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题&#xff1a;docker pull 失败 网络不同&#xff0c;需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

JAVA后端开发——多租户

数据隔离是多租户系统中的核心概念&#xff0c;确保一个租户&#xff08;在这个系统中可能是一个公司或一个独立的客户&#xff09;的数据对其他租户是不可见的。在 RuoYi 框架&#xff08;您当前项目所使用的基础框架&#xff09;中&#xff0c;这通常是通过在数据表中增加一个…...

IP如何挑?2025年海外专线IP如何购买?

你花了时间和预算买了IP&#xff0c;结果IP质量不佳&#xff0c;项目效率低下不说&#xff0c;还可能带来莫名的网络问题&#xff0c;是不是太闹心了&#xff1f;尤其是在面对海外专线IP时&#xff0c;到底怎么才能买到适合自己的呢&#xff1f;所以&#xff0c;挑IP绝对是个技…...

基于IDIG-GAN的小样本电机轴承故障诊断

目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) ​梯度归一化(Gradient Normalization)​​ (2) ​判别器梯度间隙正则化(Discriminator Gradient Gap Regularization)​​ (3) ​自注意力机制(Self-Attention)​​ 3. 完整损失函数 二…...

2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)

安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...

wpf在image控件上快速显示内存图像

wpf在image控件上快速显示内存图像https://www.cnblogs.com/haodafeng/p/10431387.html 如果你在寻找能够快速在image控件刷新大图像&#xff08;比如分辨率3000*3000的图像&#xff09;的办法&#xff0c;尤其是想把内存中的裸数据&#xff08;只有图像的数据&#xff0c;不包…...

Vue ③-生命周期 || 脚手架

生命周期 思考&#xff1a;什么时候可以发送初始化渲染请求&#xff1f;&#xff08;越早越好&#xff09; 什么时候可以开始操作dom&#xff1f;&#xff08;至少dom得渲染出来&#xff09; Vue生命周期&#xff1a; 一个Vue实例从 创建 到 销毁 的整个过程。 生命周期四个…...

SpringAI实战:ChatModel智能对话全解

一、引言&#xff1a;Spring AI 与 Chat Model 的核心价值 &#x1f680; 在 Java 生态中集成大模型能力&#xff0c;Spring AI 提供了高效的解决方案 &#x1f916;。其中 Chat Model 作为核心交互组件&#xff0c;通过标准化接口简化了与大语言模型&#xff08;LLM&#xff0…...