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

数据结构-邻接矩阵

介绍

邻接矩阵,是表示图的一种常见方式,具体表现为一个记录了各顶点连接情况的呈正方形的矩阵。

假设一共有以下顶点,其连接关系如图所示

那么,怎么表示它们之间的连接关系呢?

我们发现,各条边所连接的都是两个顶点,联想到我们之前学过的能表示两个量直接关系的数据结构,二维数组就是一个不错的选择。

如果i,j两个节点之间存在边联系它们,那么就将graph[i][j]值记为1,如果不存在边联系它们,就记为0.

这样一来,可以表示图中节点关系的邻接矩阵可以具象化为:

由于例图为无向图(即各顶点间路径没有具体指向),所以graph[i][j]与graph[j][i]的值相同,有向图中则需要将两个值单独判断

具体实现

根据输入的各条边的信息(即两个顶点)可以生成邻接矩阵

    cin>>n>>m;for (int i=0;i<n;i++) {for (int j=0;j<n;j++) {graph[i][j]=0;//初始化邻接矩阵}}for (int i=0;i<m;i++) {int u,v;cin>>u>>v;//读入边信息,更新邻接矩阵graph[u][v]=1;graph[v][u]=1; //如果是无向图,则还要更新graph[v][u]}for (int i=0;i<n;i++) {// 输出邻接矩阵for (int j=0;j<n;j++) {cout<<graph[i][j]<< " ";}cout<<endl;}

根据邻接矩阵来实现各顶点相邻顶点的输出

1)借助结构体来方便记录各顶点的相邻情况

#define MAXN 100 // 最大顶点数
int graph[MAXN][MAXN]; // 邻接矩阵
struct Node{int value;int num;//记录相邻顶点数目Node** neib;//记录相邻顶点
};

2)遍历邻接矩阵,将相邻的顶点添入结构体内,记录相邻顶点

Node* init(int v) {//初始化顶点信息Node* temp=(Node*)malloc(sizeof(Node));temp->value=v;temp->num=0;//邻居数开始为0temp->neib=NULL;//记录邻居的指针一开始为空return temp;
}
Node** generateGraph() {Node** nodes=(Node**)malloc(n*sizeof(Node*));//为结构体分配空间储存每个顶点信息for (int i=0; i<=n; i++) {nodes[i]=init(i);//初始化每一个顶点代表的结构体}for (int i=0; i<=n; i++) {for (int j=i; j<=n; j++) {if (graph[i][j]==1) {//如果两个顶点相邻addNeighbor(nodes[i],nodes[j]);addNeighbor(nodes[j],nodes[i]); // 无向图需要更新nodes[j]->neibm++;}}}return nodes;
}

3)为邻接矩阵中为1的两个顶点更新邻居信息

void addNeighbor(Node* temp,Node* neighbor) {temp->num++;//邻居数增加
//重新分配指针内存,增加指针数,用来指向新的邻居temp->neib=(Node**) realloc(temp->neib,temp->num*sizeof(Node*));temp->neib[temp->num-1]=neighbor;//记录新邻居地址
}

这里用realloc来重新分配内存空间

malloc与realloc的不同:

malloc:用于申请一块指定大小的内存空间,并返回指向该空间的地址

realloc:接受两个参数:旧的内存指针与新的大小,用于重新调整一个已经分配完空间的内存大小,并可以将原空间的内容复制到新开辟的空间中,同时释放原内存

4)输出顶点信息

for (int i=0;i<=n;i++) {cout<<nodes[i]->value)<<":";for (int j=0;j<=nodes[i]->num;j++) {//输出所有相邻顶点cout<<nodes[i]->neib[j]->value<<" ";}cout<<endl;}

相关文章:

数据结构-邻接矩阵

介绍 邻接矩阵&#xff0c;是表示图的一种常见方式&#xff0c;具体表现为一个记录了各顶点连接情况的呈正方形的矩阵。 假设一共有以下顶点&#xff0c;其连接关系如图所示 那么&#xff0c;怎么表示它们之间的连接关系呢&#xff1f; 我们发现&#xff0c;各条边所连接的都…...

基于CNN-GRU-Attention的时间序列回归预测matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 CNN&#xff08;卷积神经网络&#xff09;部分 4.2 GRU&#xff08;门控循环单元&#xff09;部分 4.3 Attention机制部分 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版…...

Docker部署Halo容器并结合内网穿透实现公网访问本地个人博客

文章目录 1. Docker部署Halo1.1 检查Docker版本如果未安装Docker可参考已安装Docker步骤&#xff1a;1.2 在Docker中部署Halo 2. Linux安装Cpolar2.1 打开服务器防火墙2.2 安装cpolar内网穿透 3. 配置Halo个人博客公网地址4. 固定Halo公网地址 本文主要介绍如何在CentOS 7系统使…...

纯css实现文字左右循环滚动播放效果

思路&#xff1a;由两个span模块组成&#xff0c;第一个为空的span内容&#xff0c;为的是实现第二个span内容缓慢出现的效果。 代码如下&#xff1a; <div class"scrollingStyle"><span class"first-marquee"></span><span class&q…...

【Java EE初阶二十二】https的简单理解

1. 初识https 当前网络上,主要都是 HTTPS 了,很少能见到 HTTP.实际上 HTTPS 也是基于 HTTP.只不过 HTTPS 在 HTTP 的基础之上, 引入了"加密"机制&#xff1b;引入 HTTPS 防止你的数据被黑客篡改 &#xff1b; HTTPS 就是一个重要的保护措施.之所以能够安全, 最关键的…...

系统学习Python——装饰器:类装饰器-[跟踪对象接口:基础知识]

分类目录&#xff1a;《系统学习Python》总目录 文章《系统学习Python——装饰器&#xff1a;类装饰器-[单例类&#xff1a;基础知识]》的单例示例阐明了如何使用类装饰器来管理一个类的所有实例。类装饰器的另一个常用场景是为每个生成的实例扩展接口。类装饰器基本上可以在实…...

go-redis 使用 redis 6.0.14 版本错误: consider implementing encoding.BinaryMarshaler

使用方法 err : bp.data.redis.Get(ctx, policyKey).Scan(&result)起初在 redis 5.x.x 版本并没有遇到错误&#xff0c;但是在切换 redis 实例之后就出现了错误&#xff08;他们之间只是版本不同&#xff09;。 修复方法 看错误日志的描述&#xff0c;大概含义就是需要我们…...

计网 - 域名解析的工作流程

文章目录 Pre引言1. DNS是什么2. 域名结构3. 域名解析的工作流程4. 常见的DNS记录类型5. DNS安全6. 未来的发展趋势 Pre 计网 - DNS 域名解析系统 引言 在我们日常使用互联网时&#xff0c;经常会输入各种域名来访问网站、发送电子邮件或连接其他网络服务。然而&#xff0c;我…...

普中51单片机学习(EEPROM)

EEPROM IIC串行总线的组成及工作原理 I2C总线的数据传送 数据位的有效性规定 I2C总线进行数据传送时&#xff0c;时钟信号为高电平期间&#xff0c;数据线上的数据必须保持稳定&#xff0c;只有在时钟线上的信号为低电平期间&#xff0c;数据线上的高电平或低电平状态才允许…...

智能风控体系之供应链业务模式

供应链金融是一种针对中小企业的新型融资模式&#xff0c;将资金流有效整合到供应链管理的过程中&#xff0c;既为供应链各环节企业提供贸易资金服务&#xff0c;又为供应链弱势企业提供新型贷款融资服务&#xff0c;以核心客户为依托&#xff0c;以真实贸易背景为前提&#xf…...

最少停车数(C 语言)

题目描述 特定大小的停车场&#xff0c;数组cars[]表示&#xff0c;其中1表示有车&#xff0c;0表示没车。车辆大小不一&#xff0c;小车占一个车位&#xff08;长度1&#xff09;&#xff0c;货车占两个车位&#xff08;长度2&#xff09;&#xff0c;卡车占三个车位&#xf…...

MAC M1安装vmware和centos7虚拟机并配置静态ip

一、下载vmware和centos7镜像 1、VMWare Fusion 官网的下载地址是&#xff1a;下载地址 下载好之后注册需要秘钥&#xff0c;在官网注册后使用免费的个人秘钥 2、centos7 下载地址&#xff1a; https://biosyxh.cn:5001/sharing/pAlcCGNJf 二、虚拟机安装 直接将下…...

java 课程签到管理系统Myeclipse开发mysql数据库web结构jsp编程servlet计算机网页项目

一、源码特点 java 课程签到管理系统是一套完善的java web信息管理系统 采用serlvetdaobean&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&#xff0…...

Linux——网络通信TCP通信常用的接口和tcp服务demo

文章目录 TCP通信所需要的套接字socket()bind()listen()acceptconnect() 封装TCP socket TCP通信所需要的套接字 socket() socket()函数主要作用是返回一个描述符&#xff0c;他的作用就是打开一个网络通讯端口&#xff0c;返回的这个描述符其实就可以理解为一个文件描述符&a…...

【web | CTF】反序列化打法

天命&#xff1a;因为是php的上古版本&#xff0c;所以本机无法复现&#xff0c;只能用归纳法解决&#xff0c;就是题海战术找相同点&#xff0c;fuzz来测试新的题目 题目一&#xff1a;绕过正则和绕过__wakeup函数&#xff0c;private属性 【web | CTF】攻防世界 Web_php_uns…...

如何在Linux搭建Inis网站,并发布至公网实现远程访问【内网穿透】

如何在Linux搭建Inis网站&#xff0c;并发布至公网实现远程访问【内网穿透】 前言1. Inis博客网站搭建1.1. Inis博客网站下载和安装1.2 Inis博客网站测试1.3 cpolar的安装和注册 2. 本地网页发布2.1 Cpolar临时数据隧道2.2 Cpolar稳定隧道&#xff08;云端设置&#xff09;2.3.…...

YOLOv9来了! 使用可编程梯度信息学习你想学的内容, v7作者新作!【文献速读】

YOLOv9文献速读&#xff0c;本文章使用 GPT 4.0 和 Ai PDF 工具完成。 文章地址&#xff1a;https://arxiv.org/pdf/2402.13616.pdf 文章目录 文章简介有哪些相关研究&#xff1f;如何归类&#xff1f;谁是这一课题在领域内值得关注的研究员&#xff1f;论文试图解决什么问题&a…...

【鸿蒙 HarmonyOS 4.0】网络请求

一、介绍 资料来自官网&#xff1a;文档中心 网络管理模块主要提供以下功能&#xff1a; HTTP数据请求&#xff1a;通过HTTP发起一个数据请求。WebSocket连接&#xff1a;使用WebSocket建立服务器与客户端的双向连接。Socket连接&#xff1a;通过Socket进行数据传输。 日常…...

QT中的多线程有什么作用?

概述 在学习QT线程的时候我们首先要知道的是QT的主线程&#xff0c;也叫GUI线程&#xff0c;意如其名&#xff0c;也就是我们程序的最主要的一个线程&#xff0c;主要负责初始化界面并监听事件循环&#xff0c;并根据事件处理做出界面上的反馈。但是当我们只限于在一个主线程上…...

redis最佳实践

原则&#xff1a;redis希望存储的是热点数据&#xff0c;尽量可以在一天内访问到。 最佳实践 选择合适的数据结构 redis有String、Hash、Set、SortedSet、List等结构&#xff0c;主要依据业务需要进行选择 string:几乎所有数据都可以用string存储&#xff0c;但是最好适用于…...

R3nzSkin国服换肤工具:免费体验所有英雄联盟皮肤的终极指南

R3nzSkin国服换肤工具&#xff1a;免费体验所有英雄联盟皮肤的终极指南 【免费下载链接】R3nzSkin-For-China-Server Skin changer for League of Legends (LOL) 项目地址: https://gitcode.com/gh_mirrors/r3/R3nzSkin-For-China-Server 你是否梦想在英雄联盟国服中免费…...

Proteus与Keil联调实战:从零搭建智能温控仿真系统

1. 环境准备与工具安装 第一次接触Proteus和Keil联调时&#xff0c;我花了大半天时间在环境配置上。现在回想起来&#xff0c;其实只要按步骤操作&#xff0c;半小时就能搞定所有准备工作。先说说必备的软件清单&#xff1a;Proteus 8.9以上版本、Keil MDK-ARM&#xff08;记得…...

长期项目使用Taotoken聚合API在稳定性与成本上的综合感受

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 长期项目使用Taotoken聚合API在稳定性与成本上的综合感受 在最近一个持续数月的实际开发项目中&#xff0c;我们选择将Taotoken作为…...

Excel数据导入实战:为缺失ID列批量生成标准UUID

1. 为什么需要为Excel数据批量生成UUID&#xff1f; 最近在处理一个数据迁移项目时&#xff0c;遇到了一个典型问题&#xff1a;从Navicat导出的Excel表格缺少主键列&#xff0c;导致后续数据导入时频频报错。这种情况在数据迁移、系统对接时特别常见。UUID&#xff08;通用唯…...

专业音频捕获终极指南:OBS-ASIO插件3步实现超低延迟录音

专业音频捕获终极指南&#xff1a;OBS-ASIO插件3步实现超低延迟录音 【免费下载链接】obs-asio ASIO plugin for OBS-Studio 项目地址: https://gitcode.com/gh_mirrors/ob/obs-asio 在专业音频制作和直播领域&#xff0c;实现毫秒级延迟的音频捕获是确保音视频完美同步…...

从算法理想向工程现实的跨越:SLAM 核心架构、思维误区与 Nav2 实战避坑指南

前言&#xff1a;直面 SLAM 的“先有鸡还是先有蛋” 在机器人领域&#xff0c;SLAM&#xff08;Simultaneous Localization and Mapping&#xff0c;同时定位与地图构建&#xff09; 毫无疑问是最耀眼的明珠之一。简单来说&#xff0c;它的核心任务就是让一个机器人在未知环境中…...

AMD Ryzen嵌入式COM Express模块:工业边缘计算的高性能解决方案

1. 项目概述&#xff1a;当工业计算遇上“锐龙”芯在工业自动化、边缘计算和高端嵌入式领域&#xff0c;COM Express&#xff08;Computer-On-Module Express&#xff09;模块一直是构建紧凑、高性能、高可靠性系统的基石。它就像一台浓缩的、标准化的“电脑主板核心”&#xf…...

基于XCKU060 FPGA的高速数据采集卡硬件架构与开发实践

1. 项目概述与核心价值最近在做一个高速数据采集与实时处理的项目&#xff0c;对市面上的FPGA加速卡做了一圈调研和测试。其中&#xff0c;青翼这款基于XCKU060 FPGA的4路SFP光纤数据处理板卡&#xff08;型号PCIE734&#xff09;给我留下了挺深的印象。它本质上是一张插在服务…...

百万WordPress站点告急!Avada Builder插件曝高危漏洞,你的后台还安全吗?

最近WordPress圈子里又炸开了锅。一款装机量突破百万的网红插件——Avada Builder&#xff0c;被安全团队揪出了两个致命漏洞。这事儿要是处理不及时&#xff0c;轻则数据库密码泄露&#xff0c;重则整个站点被人翻个底朝天。更扎心的是&#xff0c;攻击门槛低到离谱&#xff0…...

异常处理与性能调优:熬夜、加班与医美术后的“内服架构”实战指南

在互联网与高科技行业&#xff0c;系统的稳定运行往往伴随着开发者的极度透支。作为常年面对高并发需求和深夜发版的“IT 民工”或高压职场人&#xff0c;我们经常会遇到这样的尴尬场景&#xff1a;连续两周的 996 之后&#xff0c;面对电脑屏幕黑屏时的倒影&#xff0c;发现自…...