图的邻接矩阵存储法详解与C++实现

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

简介:
        在图论中,图是一种重要的数据结构,用于表示各种实际问题中的关系和连接。图的存储是图算法的基础,本文将详细介绍图的邻接矩阵存储法,以及使用C++语言实现该存储结构的方法。

目录

1. 什么是图?

2. 图的邻接矩阵存储法简介

3. 邻接矩阵存储法的优缺点

4. C++实现图的邻接矩阵存储法 及其基本操作

4.1 图的数据结构定义

4.2 初始化图

4.3 判断是否存在边(两个顶点相邻) 

4.4 添加边与删除边

4.5 获取和设置两个顶点之间的边权重值

4.6 列出图中与顶点x邻接的边

4.7 在图中插入顶点x,删除顶点x

4.8 求图中顶点x的第一个邻接点

4.9 求图中顶点x的除y以外的下一个邻接点(y是x的邻接点)

4.10 示例与测试

 5. 总结


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)) {//不存在要添加的这条边
     
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不想学习啊啊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值