简介:
在图论中,图是一种重要的数据结构,用于表示各种实际问题中的关系和连接。图的存储是图算法的基础,本文将详细介绍图的邻接矩阵存储法,以及使用C++语言实现该存储结构的方法。
目录
4.9 求图中顶点x的除y以外的下一个邻接点(y是x的邻接点)
1. 什么是图?
图是由节点(顶点)和节点之间的连接(边)组成的一种非线性数据结构。图可以用来表示许多实际问题,如社交网络中的用户关系、地图中的城市道路、计算机网络中的节点通信等。
2. 图的邻接矩阵存储法简介
邻接矩阵是一种常见的图的存储方法,用二维数组表示图中各个顶点之间的连接关系。如果有n个顶点,那么邻接矩阵就是一个n x n的二维数组,其中adj_matrix[i][j]表示顶点i与顶点j之间的边的情况。如果顶点i与顶点j相邻接,则adj_matrix[i][j]的值为1或边的权重值;如果不相邻接,则adj_matrix[i][j]的值为0或表示无穷大。
3. 邻接矩阵存储法的优缺点
优点:
适用于稠密图,当图的边数接近完全图n(n-1)/2时,邻接矩阵存储法的空间利用率较高。
判断两个顶点是否相邻的操作高效,时间复杂度为O(1)。
缺点:
对于稀疏图,邻接矩阵会占用大量的存储空间,空间复杂度为O(n^2)。
添加和删除边时可能需要额外操作来维护对称性(对于无向图)。
4. C++实现图的邻接矩阵存储法 及其基本操作
4.1 图的数据结构定义
我们可以使用C++中来表示图的邻接矩阵存储法。以下是图的结构体定义:
#define MAX_VERTICES 100 //顶点数目最大值
typedef char VertexType; //顶点的数据类型
typedef int EdgeType; //带权图中边上权值的数据类型
struct Graph{
int num_vertices, num_edge; // 图当前顶点和边的数量
VertexType vex[MAX_VERTICES]; //顶点表
EdgeType adj_matrix[MAX_VERTICES][MAX_VERTICES]; // 邻接矩阵,边表
};
4.2 初始化图
//初始化
void init_graph(Graph* graph, int num_vertices) {
graph->num_vertices = num_vertices;
graph->num_edge = 0;
// 初始化邻接矩阵,初始值都为0(表示没有边)
for (int i = 0; i < num_vertices; ++i) {
//顶点数据赋值
graph->vex[i] = 'a' + i;
//邻接矩阵初始化
for (int j = 0; j < num_vertices; ++j) {
graph->adj_matrix[i][j] = 0;
}
}
}
4.3 判断是否存在边(两个顶点相邻)
bool is_edge(Graph* graph, int source, int destination) {
//有向图
return graph->adj_matrix[source][destination] != 0;
}
4.4 添加边与删除边
添加边与删除边的操作分别是add_edge和remove_edge方法。对于无向图,添加边时需要设置对称位置。添加和删除前应该先判断边是不是存在。
// 添加边,将邻接矩阵中对应的位置设为1(或边的权重值)
void add_edge(Graph* graph, int source, int destination, int weight) {
if (!is_edge(graph, source, destination)) {//不存在要添加的这条边

本文介绍了图的邻接矩阵存储方法,包括其优缺点,并提供了C++实现图的邻接矩阵存储的代码示例,涵盖初始化图、添加删除边、获取权重值等基本操作。
最低0.47元/天 解锁文章
2万+

被折叠的 条评论
为什么被折叠?



