当前位置:首页 > 其他 > 手搓邻接矩阵类代码注释与实现指南:从零开始理解图论数据结构(适合小白)

手搓邻接矩阵类代码注释与实现指南:从零开始理解图论数据结构(适合小白)

1个月前 (06-10)

一、简介和特点

邻接矩阵是用于表示(Graph)的一种数据结构,通常用二维数组存储节点之间的关系。本文的graph类通过C++实现了一个基础的邻接矩阵结构,特点如下:

1. 动态创建:根据用户输入的节点数量(sum)动态分配内存,避免固定大小的限制。

2. 边权值存储:矩阵元素可存储边的权重(如距离、成本等),支持带权图。

3. 简洁接口:提供添加节点(边)、打印矩阵的公有方法,方便调用。

二、优点

1. 易理解性:相比链表实现的邻接表,矩阵结构更直观,适合新手入门图论

2. 快速查询:通过索引直接访问节点关系(node[i][j]),时间复杂度为O(1)。

3. 灵活扩展:通过构造函数参数可动态调整图规模,适应不同问题需求。

三、实现步骤

1. 定义类结构:声明sum(节点总数)和node(指向二维数组指针)。

2. 构造函数初始化:

接收节点数newsum,赋值给sum。

动态分配sum行指针数组:node = new int*[sum]。

为每行分配sum列的数组空间,并初始化所有元素为0。

3. 添加边方法addnode:

接收参数:行索引line、列索引row、边权值val。

将val赋值到对应矩阵位置:node[line][row] = val。

4. 打印方法print:

双层循环遍历矩阵,输出每个元素后换行,展示完整邻接矩阵。

四、代码与注释

#include <iostream>
using namespace std;

// 定义邻接矩阵类
class graph {
private:  
    // 节点总数(矩阵行列数)
    int sum = 0;
    // 指向二维数组的指针
    int** node;
public:
    // 构造函数:初始化矩阵大小并赋初值
    graph(int newsum) {
        sum = newsum;  // 设置节点数量
        node = new int* [sum];  // 动态分配行指针数组
        for (int i = 0; i < sum; i++) {  // 遍历每行
            node[i] = new int[sum];  // 为每行分配列数组
            for (int j = 0; j < sum; j++) {  // 初始化元素为0
                node[i][j] = 0;
            }
        }
    }
    // 添加边方法(设置节点i到j的权值)
    void addnode(int line, int row, int val) {
        node[line][row] = val;  // 将val写入指定位置
    }
    // 打印矩阵方法
    void print() {
        for (int i = 0; i < sum; i++) {  // 遍历行
            for (int j = 0; j < sum; j++) {
                cout << node[i][j] << " ";  // 输出元素
            }
            cout << endl;  // 换行
        }
    }
};

五、总结

通过手搓邻接矩阵类,新手可以深入理解:

1. 图论数据结构的底层实现逻辑;

2. C++动态内存管理(new/delete)的应用;

3. 二维数组在算法中的灵活使用。

原创内容 转载请注明出处

分享给朋友:

相关文章

手搓顺序表类代码注释与详解:从零实现动态数组(新手教程)

一、简介和特点顺序表(Sequential List)是数据结构中基础的一种线性表,其特点是将数据元素存储在连续的内存空间中。通过数组实现,支持随机访问(即通过索引直接访问元素),适用于频繁随机读取的...

2024蓝桥杯省赛B组“传送阵”题解(C++代码+图论算法优化)

2024蓝桥杯省赛B组“传送阵”题解(C++代码+图论算法优化)

一、题目解读2024年蓝桥杯省B组“传送阵”题目要求处理一个包含n个节点的图,节点间存在单向传输关系。每个节点i可传送至a[i]指定的节点,形成可能存在的环结构。题目需求解从任意节点出发能到达的最长路...

力扣3112题解法:带时间限制的最短路径问题解析(C++代码)

力扣3112题解法:带时间限制的最短路径问题解析(C++代码)

一、题目解读力扣3112题要求解决带时间限制的最短路径问题:给定一个有向图,节点具有消失时间,需计算从起点到各节点的最短路径,且路径总时间不能超过节点的消失时间。题目难点在于需在传统最短路径算法(如D...

【力扣2846题】图论+二进制提升:高效解决连通性问题(附C++代码)

【力扣2846题】图论+二进制提升:高效解决连通性问题(附C++代码)

一、题目解读力扣2846题要求解决一个基于图连通性的操作优化问题。给定一个无向图,包含边权重,以及一系列查询,每个查询询问两点间路径的最小操作次数。题目关键在于高效计算路径上权重分布的统计信息,并转化...

洛谷1656题解:基于Tarjan算法求解割边问题(附代码与详细步骤)

洛谷1656题解:基于Tarjan算法求解割边问题(附代码与详细步骤)

一、题目解读洛谷1656题要求在无向图中找出所有割边(即删除后导致图不连通的边)。题目核心在于判断图的连通性,并识别哪些边是“桥”。需理解图论中的连通分量概念,以及如何通过算法高效定位割边。二、解题思...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。