数据结构-邻接矩阵

介绍

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

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

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

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

如果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;}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/474211.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安装luajit及使用python运行lua脚本

使用Python运行lua脚本前&#xff0c;需要先安装LuaJIT&#xff0c;LuaJIT的官网是下载 (luajit.org) 目前已不再使用.exe文件的下载方式&#xff0c;需要使用Git从公共仓库下载源码&#xff0c;git命令为&#xff1a; $ git clone https://luajit.org/git/luajit.git 下载后…

泰华仪表 智能热电偶温度变送器一进二出K型隔离模拟量输出4-20mA

品牌&#xff1a;泰工华控 型号&#xff1a;TSP-TC 产地&#xff1a;中国大陆 省份&#xff1a;安徽省 颜色分类&#xff1a;一进二出&#xff08;下单备注参数&#xff09;,K型热电偶转4-20mA(一进一出),K型热电偶转0-5V(一进一出),其他类型ESJBNR等&#xff08;下单备注&…

基于CU,PO,RD,IPO矩阵图分析数据资产-自创

术语 数据资产&#xff1a;数据资产是具有价值的数据资源。没有价值的数据资源&#xff0c;通过采集&#xff0c;整理&#xff0c;汇总等加工后&#xff0c;也可以成为具有直接或间接价值的数据资产。传统企业逐渐数字化转型&#xff0c;尤其是互联网企业&#xff0c;都十分重视…

Swing程序设计(10)列表框,文本框,文本域,密码框

文章目录 前言一、列表框二、文本框&#xff08;域&#xff09; 1.文本框2.文本域三、密码框总结 前言 该篇文章简单介绍了Java中Swing组件里的列表框、文本框、密码框。 一、列表框 列表框&#xff08;JList&#xff09;相比下拉框&#xff0c;自身只是在窗体上占据固定的大小…

【初始消息队列】消息队列的各种类型

消息队列相关概念 什么是消息队列 MQ(message queue)&#xff0c;从字面意思上看&#xff0c;本质是个队列&#xff0c;FIFO 先入先出&#xff0c;只不过队列中存放的内容是 message 而已&#xff0c;还是一种跨进程的通信机制&#xff0c;用于上下游传递消息。在互联网架构中…

对账中心系统架构设计与实现的实践总结

随着数字化时代的到来&#xff0c;越来越多的企业开始使用对账中心系统来管理其财务交易。对于一个成功的对账中心系统&#xff0c;其架构设计和实现非常关键。本文将探讨对账中心系统架构设计与实现的重要性、关键原则和实施过程中需要考虑的要点&#xff0c;帮助企业构建强大…

pm2常用命令有哪些?

PM2 是一个流行的 Node.js 进程管理工具&#xff0c;用于管理和监控 Node.js 应用程序。以下是一些常用的 PM2 命令&#xff1a; 启动应用程序&#xff1a; pm2 start app.js这将启动名为 app.js 的 Node.js 应用程序。 列出所有应用程序&#xff1a; pm2 list这将列出当前所有…

书生浦语-模型微调

大语言模型微调 指令微调的流程 LoRA(旁路分支微调) Xtuner微调框架 微调训练 作业 微调作业需要多训练几个epoch&#xff0c;这里训练了16个epoch

Rust 学习笔记 - 注释全解

前言 和其他编程语言一样&#xff0c;Rust 也提供了代码注释的功能&#xff0c;注释用于解释代码的作用和目的&#xff0c;帮助开发者理解代码的行为&#xff0c;编译器在编译时会忽略它们。 单行注释 单行注释以两个斜杠 (//) 开始&#xff0c;只影响它们后面直到行末的内容…

win10下wsl2使用记录(系统迁移到D盘、配置国内源、安装conda环境、配置pip源、安装pytorch-gpu环境、安装paddle-gpu环境)

wsl2 安装好后环境测试效果如下&#xff0c;支持命令nvidia-smi&#xff0c;不支持命令nvcc&#xff0c;usr/local目录下没有cuda文件夹。 系统迁移到非C盘 wsl安装的系统默认在c盘&#xff0c;为节省c盘空间进行迁移。 1、输出wsl -l 查看要迁移的系统名称 2、执行导出命…

Wheeltec小车的开发实录(3)之 wheeltec小车中配置自己的全局优化算法

我一贯的学习路子就先模仿后创造 所以我找到了哔哩哔哩上的一个up写好的算法放到我的小车中 ros的官方教程链接是&#xff1a; navigation/Tutorials/Writing a Local Path Planner As Plugin in ROS - ROS Wiki 首先去up的github上下载插件 Grizi-ju (xiaoju) GitHub 下…

VMware Workstation创建虚拟机

一、VMware Workstation下载安装 1、安装教程 VMware Workstation下载安装&#xff08;含密钥&#xff09; 二、VMware Workstation 创建虚拟机 1、新建虚拟机&#xff0c;点击“创建新的虚拟机” 2、选择自定义&#xff08;高级&#xff09;&#xff0c;点击“下一步” 3…