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

邻接矩阵实现图的存储

目录

一. 前言

二. 用邻接矩阵来实现图的存储


一. 前言

1. 图的定义

        所谓图就是包含顶点和边的集合,是一种多对多的关系。用符号表示为:G=(V,E)。其中,V代表顶点(数据元素)的有穷非空集合,E代表边的有穷集合。也就是说一个图可以没有边,但顶点不能没有。

2. 有向图和无向图

        顶点之间靠一个带有方向的弧连接的图就叫有向图,无向图则相反,边并没有方向。

3. 完全图

        任意两个点都有一条边相连的图。如下所示:

4.稀疏图和稠密图

        稀疏图就是有很少边或弧的图。而稠密图则是有较多边和弧的图。

5. 权和网

        图中边或弧所具有的相关数称为权。表明从一个顶点到另外一个顶点的距离或耗费。而网就是边或者弧带权的图,也就分为无向网和有向网。

6.连通图(强连通图)

        在无(有)向图G中,若对任何两个顶点v,u都存在从v到u的路径,则称G是连通图(强连通图)。

7. 连通分量(强连通分量)

        无向图(有向图)的极大连通子图称为G的连通分量(强连通分量)。其中,极大连通子图的含义为:该子图是G连通子图,但如果将G的任何不在该子图中的顶点加入,那么这个子图将不再连通,我们就称这样的连通子图为极大连通子图。

8. 极小连通子图

        该子图是G的连通子图,在该子图中删除任何一条边,子图不再连通。

9. 邻接矩阵

        所谓邻接矩阵,拿无向图来举例,就如下所示:

因为v1和v2是相连的,并且这是一个无向图,并没有权值。所以就在v1行v2列的数字为1。邻接矩阵中为0的地方,就代表那两个顶点并没有直接相连。

如果是无向网(表示有权值的图),就不是在相连的地方赋值1了,而是赋值这两个顶点所连边的权值。如下所示:

 

二. 用邻接矩阵来实现图的存储

        我们上面知道了这个存储结构的原理之后,就可以考虑用代码来实现了。用邻接矩阵来创建一个无向图的代码如下所示:

#include<iostream>
using  namespace std;#define MAXnum 100//邻接矩阵的结构类型定义
typedef struct{char vexs[MAXnum];    //定义一个数组存放顶点,作为顶点表int arcs[MAXnum][MAXnum];    //邻接矩阵int vexnum,arcnum;    //图当前的顶点数和边数
}AMGraph;    //Adjacency Matrix Graphint LocateGraph(AMGraph G,char c);int Create(AMGraph &G){cout<<"请输入总的顶点数和边数(中间用空格隔开):";    cin>>G.vexnum>>G.arcnum;    //先输入总的顶点数和边数for(int i=0;i<G.vexnum;i++){    //依次输入顶点信息,有几个顶点就输入几个cout<<"请输入顶点信息(顶点名称):";cin>>G.vexs[i];}//接着给所有的边的权值赋一个最大值for(int i=0;i<G.vexnum;i++){for(int j=0;j<G.vexnum;j++){G.arcs[i][j]=65536;}}//开始录入边的信息for(int i=0;i<G.arcnum;i++){char v1;    //用这两个变量来接收两个顶点的值char v2;int w;    //接收权值cout<<"请输入其中一条边两边的顶点和权值:";cin>>v1>>v2>>w;int n=LocateGraph(G,v1);    //通过这个函数来获取这两个顶点在顶点表中的序号int m=LocateGraph(G,v2);G.arcs[n][m]=w;    //给邻接矩阵重新赋值G.arcs[m][n]=w;}
return 1;
}int LocateGraph(AMGraph G,char c){for(int i=0;i<G.vexnum;i++){if(G.vexs[i]==c) return i;}return -1;
}int main(){AMGraph G;Create(G);    //这里我们在创建好了我们想要的邻接矩阵之后就可以进行相关操作cout<<G.vexs[1];    //比如我这里进行一个小测试,让它输出我们的第二个顶点名称,看是否是我们所创建的邻接矩阵
}

这里我们举了如何用邻接矩阵来实现无向网,我们要是想要用邻接矩阵来创建无向图的话,首先就得初始化邻接矩阵的权值都为0,如果有相连的再赋值为1。只需要在上面代码的基础上修改这部分的内容就行。如下所示为修改之后的部分代码(其他代码一样):

for(int i=0;i<G.vexnum;i++){for(int j=0;j<G.vexnum;j++){G.arcs[i][j]=0}
}
G.arcs[n][m]=1;
G.arcs[n][m]=1;

下面我们继续看看用邻接矩阵来实现有向图跟有向网,因为无向图的邻接矩阵是对称的,所以上面的代码就得出现这样的代码:

G.arcs[n][m]=w;
G.arcs[m][n]=w;

但在我们有向图中就不再需要这样了,只需要上面一行代码就行了。也就是G.arcs[n][m]=w;就够了。并且跟上面无向图一样,相连顶点的边权值为1。 

 

 

 

 

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • fastapi实现文件上传和下载的功能
  • Python基于逻辑回归的L1正则化(Lasso Logistic Regression)进行分类数据的特征选择项目实战
  • 每天一个数据分析题(四百六十)- 麦肯锡
  • C++自定义接口类设计器之可对称赋值三
  • elk+filebeat+kafka集群部署
  • 抖音小店新宠儿成都夏光汝网络科技
  • 对优先级队列(堆)的理解
  • 【工具】-gdb-学习笔记
  • 推动未来的引擎:人工智能大模型的现状与发展
  • 基于改进拥挤距离的多模态多目标优化差分进化(MMODE-ICD)求解无人机三维路径规划(MATLAB代码)
  • 云计算学习——5G网络技术
  • 前端开发者必备:揭秘谷歌F12调试的隐藏技巧!
  • PixelMaster - 图片像素化终极利器 !
  • U盘数据恢复不再难:2024年4款工具,找回你“躲藏”的记忆
  • BootStrap前端面试常见问题
  • 【翻译】Mashape是如何管理15000个API和微服务的(三)
  • angular2 简述
  • Angular6错误 Service: No provider for Renderer2
  • CSS 三角实现
  • mysql 5.6 原生Online DDL解析
  • MySQL-事务管理(基础)
  • springboot_database项目介绍
  • Sublime text 3 3103 注册码
  • 闭包--闭包作用之保存(一)
  • 搞机器学习要哪些技能
  • 来,膜拜下android roadmap,强大的执行力
  • 理解在java “”i=i++;”所发生的事情
  • 设计模式 开闭原则
  • 延迟脚本的方式
  • mysql面试题分组并合并列
  • 组复制官方翻译九、Group Replication Technical Details
  • # 执行时间 统计mysql_一文说尽 MySQL 优化原理
  • (10)Linux冯诺依曼结构操作系统的再次理解
  • (39)STM32——FLASH闪存
  • (C++二叉树05) 合并二叉树 二叉搜索树中的搜索 验证二叉搜索树
  • (k8s)Kubernetes 从0到1容器编排之旅
  • (保姆级教程)Mysql中索引、触发器、存储过程、存储函数的概念、作用,以及如何使用索引、存储过程,代码操作演示
  • (带教程)商业版SEO关键词按天计费系统:关键词排名优化、代理服务、手机自适应及搭建教程
  • (第二周)效能测试
  • (论文阅读40-45)图像描述1
  • (生成器)yield与(迭代器)generator
  • ***利用Ms05002溢出找“肉鸡
  • .net SqlSugarHelper
  • .NET6实现破解Modbus poll点表配置文件
  • .NET开发人员必知的八个网站
  • .NET下ASPX编程的几个小问题
  • .Net语言中的StringBuilder:入门到精通
  • @Async注解的坑,小心
  • @Autowired 和 @Resource 区别的补充说明与示例
  • @column注解_MyBatis注解开发 -MyBatis(15)
  • @KafkaListener注解详解(一)| 常用参数详解
  • @value 静态变量_Python彻底搞懂:变量、对象、赋值、引用、拷贝
  • [ C++ ] 类和对象( 下 )
  • [AIGC] Spring Interceptor 拦截器详解
  • [Android View] 可绘制形状 (Shape Xml)