数据结构之图(二)——邻接矩阵
图的逻辑结构为多对多,图没有顺序存储结构,但可以借助二维数组来表示元素间的关系,即数组表示法(邻接矩阵)。图的链式存储结构可以用多重链表来描述,如邻接表,邻接多重表以及十字链表等。
邻接矩阵
- 数组(邻接矩阵)表示法:
建立一个邻接表(记录各个顶点信息)和一个邻接矩阵(表示各个顶点间的关系)。
1.设图A=(V,E)有n个顶点,则有顶点表Vexs[n]如下,
i | 0 | 1 | 2 | ⋯ \cdots ⋯ | n-1 |
---|---|---|---|---|---|
Vexs[i] | v 1 v_1 v1 | v 2 v_2 v2 | v 3 v_3 v3 | ⋯ \cdots ⋯ | v n v_n vn |
2.图的邻接矩阵是一个二维数组A.arcs[n][n],定义为:
A . a r c s [ i ] [ j ] = { 1              如 果 < i , j > ∈ E 或 者 ( i , j ) ∈ E 0              否 则 A.arcs[i][j] = \left\{ {\begin{array}{l} {1\;\;\;\;\;\; 如果< i,j > \in E或者(i,j) \in E}\\ {0\;\;\;\;\;\;否则} \end{array}} \right. A.arcs[i][j]={1如果<i,j>∈E或者(i,j)∈E0否则
无向图的邻接矩阵
- 例子:
- 特点:
1.无向图的邻接矩阵是对称的,且主对角线元素全为0(因为自己到自己没有边)。
2.顶点i的度=第i行(列)中1的个数。
3.完全图的邻接矩阵中,主对角元素为0,其余全为1。
有向图的邻接矩阵
例子:
在有向图的邻接矩阵中,
第i行的含义:以结点 v i v_i vi为尾的弧(出度边);
第i列的含义:以结点 v i v_i vi为头的弧(入度边);特点:
1.有向图的邻接矩阵可能不是对称的。
2.顶点的出度=第i行元素之和;
顶点的入度=第i列元素之和;
顶点的度=第i行元素之和+第i列元素之和。
网的邻接矩阵
网的邻接矩阵表示法:
A . a r c s [ i ] [ j ] = { W i j              < v i , v j > 或 ( v i , v j ) ∈ V R ∞                    无 边 ( 弧 ) A.arcs[i][j] = \left\{ {\begin{array}{l} {{W_{ij}}\;\;\;\;\;\; < {v_i},{v_j} > 或({v_i},{v_j}) \in VR}\\ {\infty \;\;\;\;\;\;\;\;\;无边(弧)} \end{array}} \right. A.arcs[i][j]={Wij<vi,vj>或(vi,vj)∈VR∞无边(弧)例子:
邻接矩阵的具体实现
- 邻接矩阵的存储表示:用两个数组分别存储顶点表和邻接矩阵。
#define MaxInt 32767 //表示极大值,即无穷大
#define MVNum 100 //最大顶点数
typedef char VerTexType; //设顶点的数据类型为字符型
typedef int ArcType; //假设边的权值类型为整型typedef struct
{VerTexType vexs[MVNum]; //顶点表ArcType arcs[MVNum][MVNum]; //邻接矩阵int vexnum, arcnum; //图的当前点数和边数
}AMGraph; // Adjacency Matrix Graph
- 采用邻接矩阵表示法创建无向网
- 算法思路
- 1.输入总顶点数和总边数(为vexnum和arcnum赋值)
- 2.依次输入点的信息存入顶点表中(为vexs[i]赋值)。
- 3.初始化邻接矩阵,使每个权值初始化为极大值。
- 4.构造邻接矩阵
- 算法描述:
- 算法思路
Status CreateUDN(AMGraph &G)
{cin >> G.vexnum >> G.arcnum; //输入总顶点数,总边数for (i = 0; i < G.vexnum; ++i) cin >> G.vexs[i]; //依次输入顶点的信息for (i = 0; i < G.vexnum; ++i)for (j = 0; j < G.vexnum; ++j)G.arcs[i][j] = MaxInt; //边的权值均置为极大值(无穷大)for (k = 0; k < G.arcnum; ++k) //构造邻接矩阵{ cin >> v1 >> v2 >> w; //输入一条边所依附的顶点及边的权值i = LocateVex(G, v1); j = LocateVex(G, v2); //确定v1和v2在G中的位置G.arcs[i][j] = w; //边<v1,v2>的权值为wG.arcs[j][i] = G.arcs[i][j]; //置<v1,v2>地对称边<v2,v1>的权值为w}return OK;
}
其中的LocateVex函数表示查找某顶点在顶点表中的位置,具体如下,
//在图G中查找顶点u,存在则返回其在顶点表中的下标,否则返回-1
int LocateVex(AMGraph G, VerTexType u)
{int i;for (i = 0; i < G.vexnum; ++i)if (u == G.vexs[i])return i;return -1;
}
- 采用邻接矩阵表示法创建其它图
在前面创建无向网的基础上,只需经过一点修改,就可以创建无向图,有向网和有向图,操作如下图,
邻接矩阵表示法的优缺点
优点:
- 直观、简单、好理解
- 方便检查任意一对顶点间是否存在边
- 方便找任一顶点的所有“邻接点”(有边直接相连的顶点)
- 方便计算任一顶点的“度”。
缺点:
- 不便于增加和删除顶点
- 浪费空间——存稀疏图(点很多而边很少)有大量无效元素
- 对稠密图(特别是完全图)还是很合算的
- 浪费时间——统计稀疏图中一共有多少条边
数据结构之图(二)——邻接矩阵相关推荐
- 【数据结构】图(最短路径Dijkstra算法)的JAVA代码实现
最短路径的概念 最短路径的问题是比较典型的应用问题.在图中,确定了起始点和终点之后,一般情况下都可以有很多条路径来连接两者.而边或弧的权值最小的那一条路径就称为两点之间的最短路径,路径上的第一个顶点为 ...
- 数据结构之图:邻接矩阵和邻接表、深度优先遍历和广度优先遍历
简介 线性表是一种线性结构,除了头结点和尾节点,线性表的每个元素都只有一个前取节点和一个后继节点.而树结构则相较于线性表更加复杂,它描述的关系为数据元素之间的父子关系,也是现实世界父子关系的缩影, 一 ...
- 【数据结构】图的存储结构(邻接矩阵、邻接表、十字链表、邻接多重表)及实现(C语言)
目录 1. 邻接矩阵表示法 1.1 图的邻接矩阵 1.2 创建有向网的邻接矩阵 2. 邻接表表示法 2.1 图的邻接表存储结构 2.2 创建有向图的邻接表 3. 十字链表表示法 3.1 图的十字链表存 ...
- [转]数据结构:图的存储结构之邻接矩阵
图的邻接矩阵(Adjacency Matrix)存储方式是用两个数组来表示图.一个一维的数组存储图中顶点信息,一个二维数组(称为邻接矩阵)存储图中的边或弧的信息. 设图G有n个顶点,则邻接矩阵是一个n ...
- 数据结构——图的邻接矩阵实现
图的邻接矩阵是用两个数组来表示图 一个一维数组vexs[MAXVER];用来存储顶点元素 一个二维数组arc[MAXVER][MAXVER];用来存储图的边或者弧度以及证明其存在 无向图的的二维数组 ...
- 数据结构与算法王卓-习题-第六章图-采用邻接矩阵表示图的深度优先搜索遍历(DFS)算法
目录 算法描述 算法预期效果 重难点 思路 个人解法 测试样例与输出 算法描述 创建图的邻接矩阵, 并输出dfs深度优先搜索遍历结果 算法预期效果 依次输入顶点数,边数,顶点V1~Vn,边A1~An, ...
- (九)数据结构之“图”
数据结构之"图" 图是什么 图的常用操作 图的深度/广度优先遍历 什么是深度/广度优先遍历 深度优先遍历算法口诀 广度优先遍历算法口诀 LeetCode:65.有效数字 LeetC ...
- 图:图的邻接矩阵创建、深度优先遍历和广度优先遍历详解
邻接矩阵介绍 直接说,邻接矩阵是图的一种存储结构.那么图是什么呢?图是一种逻辑结构,和线性结构.树形结构.集合结构一样 是一种逻辑结构用来描述数据对象中的数据元素之间的关系.来看下图的定义:图(Gra ...
- 【恋上数据结构】图基础知识介绍
图 数据结构回顾 图(Graph) 有向图(Directed Graph) 出度.入度 无向图(Undirected Graph) 混合图(Mixed Graph) 简单图.多重图 无向完全图(Und ...
最新文章
- C语言求3x3数组对角线元素之和
- python字符串压缩字_gzip如何在Python中压缩字符串?
- 编译原理练习题(第二章)
- 2023届IC实习小结
- 我的世界服务器玩家在线时间,将公布上线时间?我的世界中国版网易520前瞻
- 微信小程序报错 .wxss 无法找到
- python *args和**kwargs以及序列解包
- mysql 太多字段 排除某一列_Atitit 数据库排除某一列 字段 显示
- 【转载】浅析输入法原理
- python index 报错_python基础语法常见报错类型
- DataX离线数据同步工具/平台
- vb怎么判断整数_VB数学函数大全
- 【kafka】kafka 消息头的强大功能
- python反转排列_生成列表元素对的每个排列,而不重复或反转对
- linux数据向量化指令,不充分SIMD向量化技术研究.PDF
- CCS安装多版本编译器 Compiler version__更新手动下载、安装方法
- HHL论文第二弹(基本过程)
- c语言顺序结构编程题及其答案,C语言编程 顺序结构编程练习题目
- ensp-VRRP的配置
- 无刷直流电机 PWM控制