邻接矩阵法和邻接表法(图的存储)

1.邻接矩阵法

(1)邻接矩阵法定义

通过一个二维矩阵来表示图中各个顶点之间的连接关系。邻接矩阵中的行和列分别代表图中的顶点,而矩阵中的元素则表示对应顶点之间是否存在边。表示方式唯一

c 复制代码
typedef struct{
	ElementType vertex[maxVertexNum];// 顶点表
	ElementType edge[maxVertexNum][maxVertexNum];// 邻接矩阵(边表)
	int vertexNum,edgeNum;// 顶点数,边数
}adjacencyMatrix;

邻接矩阵法的空间复杂度为 O ( ∣ v ∣ 2 ) O(|v|^2) O(∣v∣2) ,适合用于稠密图。无向图的邻接矩阵是对称矩阵,可压缩存储

(2)计算顶点的度、入度、出度

类型 计算方式
度(无向图) 顶点在邻接矩阵中对应行/列中表示边存在的元素个数
入度(有向图) 顶点在邻接矩阵中对应列中表示边存在的元素个数
出度(有向图) 顶点在邻接矩阵中对应行中表示边存在的元素个数

注:邻接举证法求顶点的度/入度/出度的时间复杂度为 O ( ∣ v ∣ ) O(|v|) O(∣v∣)

(3)对称矩阵的压缩存储

策略:用一维数组存储主对角线和上(下)三角区元素

公式:i代表矩阵的行( i > = 1 i>=1 i>=1),j代表矩阵的列( j > = 1 j>=1 j>=1),k代表数组下标( k > = 0 k>=0 k>=0)

k = { i ( i − 1 ) 2 + j − 1 , i > = j j ( j − 1 ) 2 + i − 1 , j > = i k = \begin{cases} \frac{i(i-1)}{2}+j-1, & \text{i\>=j} \\ \frac{j(j-1)}{2}+i-1, & \text{j\>=i} \\ \end{cases} k={2i(i−1)+j−1,2j(j−1)+i−1,i>=jj>=i

(4)邻接矩阵法的性质

设图G的邻接矩阵为A(矩阵元素为0或1),则 A n A^n An的元素 A n [ i ] [ j ] A^n[i][j] An[i][j]等于由顶点i到顶点j的长度为n的路径数目

2.邻接表法

(1)邻接表法定义

通过链表的方式存储每个顶点所连接的边和相应的顶点。对于图中的每个顶点,邻接表都为其创建一个链表,链表中存储了与该顶点相邻的其他顶点。表示方式不唯一

c 复制代码
// 边
typedef struct EdgeNode{
	int vertexIndex;// 指向邻接表中哪个结点
	struct EdgeNode *next;// 指向下一条边的指针
}EdgeNode;
// 顶点
typedef struct vertexNode{
	VertexType data;// 顶点信息
	EdgeNode* first;// 指向第一条边的指针
}AdjacencyList[maxVertexNum];
// 邻接表存储的图
typedef struct{
	AdjacencyList vertexs;
	int vertexNum,edgeNum;
}AdjacencyGraph;

无向图中邻接表法的空间复杂度为 O ( ∣ V ∣ + 2 ∣ E ∣ ) O(|V|+2|E|) O(∣V∣+2∣E∣),有向图中邻接表法的空间复杂度为 O ( ∣ V ∣ + ∣ E ∣ ) O(|V|+|E|) O(∣V∣+∣E∣)

(2)计算顶点的度、入度、出度

类型 计算方式
度(无向图) 顶点的边链表的结点数目
入度(有向图) 遍历每个顶点的边链表,计算出指向该结点的边结点之和
出度(有向图) 顶点的边链表的结点数目
相关推荐
YL2004042617 小时前
027合并两个有序链表
java·数据结构·算法·链表
Zephyr_017 小时前
java数据结构
java·数据结构
xieliyu.18 小时前
Java手搓二叉树:基础遍历与核心操作全解析
java·开发语言·数据结构·学习
期待のcode18 小时前
Redis数据类型
运维·数据结构·redis
博界IT精灵18 小时前
图的遍历(哈喜老师)
数据结构·考研·算法·深度优先
所以遗憾是什么呢?19 小时前
【题解】Codeforces Round 1097 (Div. 2, Based on Zhili Cup 2026) (致理杯) ABCDEF
数据结构·算法·acm·codeforces·icpc·ccpc·xcpc
Lazionr20 小时前
【栈与队列经典OJ】
c语言·数据结构
夏日听雨眠20 小时前
数据结构(哈希函数)
数据结构·算法·哈希算法
诙_20 小时前
C++数据结构--B树,B+树,B*树
数据结构·b树
bnmoel20 小时前
数据结构深度剖析顺序表:结构、扩容与增删查改全解析
c语言·数据结构·算法·顺序表