当前位置: 首页 > news >正文

图的表示:邻接表和邻接矩阵

本节讲述如何在 C++ 中表示简单图, 本节将介绍邻接矩阵和邻接表的实现. 后续系列的博客中将会以邻接表为主, 偶尔会用到邻接矩阵.

环境要求

本文所用样例在Windows 11以及Ubuntu 24.04上面编译通过.

  1. Windows: 使用[Visual Studio],
  2. Ubuntu: 使用 Clang 18.1.3. (Ubuntu 24.04 系统安装版本)
  3. GCC 无法编译直接本项目代码, 因为本文代码使用了 C++20 Module, 而 GCC 对此支持不完整.

概述

本节讨论的图为简单图, 即没有自环边(自己指向自己的边)和平行边(两个顶点之间存在多条边). 根据前一节提到的知识, 我们给出一个简单图的接口:


typedef unsigned Vertex;
typedef int Weight;
typedef std::pair<Vertex, Vertex> Edge;
typedef std::tuple<Vertex, Vertex, Weight> WeightedEdge;

struct Graph {
   
  virtual ~Graph() = default;

  // 获取顶点数量
  [[nodiscard]] virtual size_t V() const = 0;

  // 获取边数量
  [[nodiscard]] virtual size_t E() const = 0;

  // 该图是有向图吗?
  [[nodiscard]] virtual bool Directed() const = 0;

  // 该图是带权图吗?
  [[nodiscard]] virtual bool Weighted() const = 0;

  // 获取顶点u的所有邻接顶点
  [[nodiscard]] virtual std::set<Vertex> Adj(Vertex u) const = 0;

  // 顶点u,v之间是否存在一条边
  [[nodiscard]] virtual bool HasEdge(Vertex u, Vertex v) const = 0;

  // 添加边u,v
  virtual void AddEdge(Vertex u, Vertex v) = 0;

  // 添加带权边u,v
  virtual void AddEdge(Vertex u, Vertex v, Weight w) = 0;

  // 将图以dot格式输出(Graphviz支持的格式), 可用于可视化
  [[nodiscard]] virtual std::string FormatAsDot() const = 0;
};

代码中为AddEdge增加了两个版本, 分别支持无权图和带权图.

有几点需要说明:

  1. 顶点和权重的类型均为无符号整型, 这是为了简化编程.
  2. 查询和操作接口均为纯虚函数, 即子类必须实现这些接口.
  3. C++虚基类需要将默认析构函数标记为virtual, 以保证派生类的析构函数被正确调用.

邻接矩阵

邻接矩阵是 n × n n \times n n×n 矩阵, 元素为两顶点间边数, 简单图邻接矩阵元素为 0 或 1, 主对角线为 0, 空间复杂度 O ( n 2 ) O(n^{2}) O(n2).
在无权图中, 邻接矩阵的元素为 0 或 1, 表示顶点之间是否存在边; 在带权图中, 邻接矩阵的元素为权重, 表示顶点之间边的权重.

在无向图中, 元素 [ m , n ] [m, n] [m,n] [ n , m ] [n, m] [n,m] 相等, 即 m m m n n n 之间存在边; 而在有向图中, [ m , n ] [m, n] [m,

相关文章:

  • android launcher拖动图标释放错位
  • 群体智能优化:粒子群算法(PSO)详解与实战
  • 工业物联网平台在设备远程运维中的应用
  • 小米 R3G 路由器刷机教程(Pandavan)
  • Python 调用 DeepSeek API 案例详细教程
  • webpack构建流程
  • untiy3D 让角色动起来,角色动画的使用
  • 常见的系统架构
  • ArcGIS基础知识之ArcMap基础设置——ArcMap选项:数据视图及布局视图选项卡的作用及设置
  • Jetpack Compose初体验
  • 保姆级GitHub大文件(100mb-2gb)上传教程
  • Texas Moves to Regulate AI 德克萨斯州着手规范人工智能
  • 3、《Spring Boot 常见注解详解》
  • 盲注技术获取数据库的表、列和具体数据
  • CZML 格式详解,javascript加载导出CZML文件示例
  • 动手学深度学习11.7. AdaGrad算法-笔记练习(PyTorch)
  • DeepSeek API 调用 - Spring Boot 实现
  • Electron视图进程和主进程通讯
  • Threadlocal的实现原理
  • Stable Diffusion 中各种模型的对比与详解
  • 微软将裁员3%,减少管理层
  • 回望乡土:对媒介化社会的反思
  • 缺字危机:一本书背后有多少“不存在”的汉字?
  • 珠峰窗口期5月开启 普通人登一次有多烧钱?
  • 上海国际电影节特设“今日亚洲”单元
  • 《广州大典研究》集刊发展座谈会:“广州学”的传承与创新