图论——基础概念

devtools/2024/9/23 20:13:39/

文章目录

  • 学习引言
  • 什么是图
  • 图的一些定义和概念
  • 图的存储方式
    • 二维数组邻接矩阵存储
      • 优缺点
    • 数组模拟邻接表存储
      • 优缺点
    • 边集数组优缺点
    • 排序前向星优缺点
    • 链式前向星优缺点


学习引言

图论,是 C++ 里面很重要的一种算法,今天,就让我们一起来了解一下图论吧!

如果对您有帮助,就点个赞吧!

什么是图

其实很简单,把点用边连起来就可以算是图。

从严格意义上来讲,图是一种数据结构,定义为:graph=(V,E)。其中,V 是一个非空有限集合,代表顶点(结点),E 代表边的集合。

图的一些定义和概念

  • 有向图:图的边有方向,只能严格遵循箭头方向从一个点到达另一个点。例如下方就是一个有向图:有向图实例
  • 无向图:图的边有方向,可以双向行走。例如下方就是一个无向图:无向图实例
  • 结点的度:仅存在在无向图中。无向图中与一个结点相连的边的个数叫做这个结点的度。
  • 结点的入度:仅存在在有向图中。有向图中以一个结点为终点的边的个数叫做这个结点的入度。
  • 结点的出度:仅存在在有向图中。有向图中以一个结点起点的边的个数叫做这个结点的出度。
  • 权值:边的“费用”,可以理解为边的长度。
  • 连通:如果图中存在一条从结点 U U U 到结点 V V V 的道路,则称 U U U V V V 是连通的。
  • 回路:起点和终点为同一结点的路径叫做回路,或称为“环”。
  • 完全图:一个有 n n n 个结点的有向图有 n × ( n − 1 ) n\times(n-1) n×(n1) 条边或一个有 n n n 个结点的无向图有 n × ( n − 1 ) 2 \frac{n\times(n-1)}2 2n×(n1) 条边。
  • 稠密图:一个边数接近完全图的图。
  • 稠密图:一个边数远远少于完全图的图。
  • 强连通分量:有向图中任意两点都连通的最大子图。下图中的 1 1 1 2 2 2 5 5 5 结点就构成一个强连通分量。特殊的,单个点也算一个强连通分量。所以下图中有 3 3 3 个强连通分量: 1 − 2 − 5 1-2-5 125 3 3 3 4 4 4强连通分量

图的存储方式

这里只讲解最常见的邻接表和邻接矩阵。

二维数组邻接矩阵存储

定义 int 类型数组:G[100][100](注:数组大小随结点的个数变化)。

G i , j G_{i,j} Gi,j 的值表示从点 i i i 到点 j j j 的权值,定义如下:
G i , j = { 1 或权值 v i 与  v j 之间有边或弧 0 或  ∞ v i 与  v j 之间无边且无弧 G_{i,j}=\begin{cases} 1\ \textrm{或权值}&v_i\ \textrm{与}\ v_j\ \textrm{之间有边或弧}\\ 0\ \textrm{或}\ \infty&v_i\ \textrm{与}\ v_j\ \textrm{之间无边且无弧} \end{cases} Gi,j={1 或权值0  vi  vj 之间有边或弧vi  vj 之间无边且无弧邻接矩阵示例图1邻接矩阵示例图2邻接表矩阵示例图3
上面的 3 3 3 个图对应的邻接矩阵分别如下:
G ( A ) = [ 0 1 1 1 1 0 1 1 1 1 0 0 1 1 0 0 ] G ( B ) = [ 0 1 1 0 0 1 0 1 0 ] G ( C ) = [ ∞ 5 8 ∞ 3 5 ∞ 2 ∞ 6 8 2 ∞ 10 4 ∞ ∞ 10 ∞ 11 3 6 4 11 ∞ ] G(A)=\begin{bmatrix} 0&1&1&1\\ 1&0&1&1\\ 1&1&0&0\\ 1&1&0&0 \end{bmatrix}\qquad G(B)=\begin{bmatrix} 0&1&1\\ 0&0&1\\ 0&1&0 \end{bmatrix}\qquad G(C)=\begin{bmatrix} \infty&5&8&\infty&3\\ 5&\infty&2&\infty&6\\ 8&2&\infty&10&4\\ \infty&\infty&10&\infty&11\\ 3&6&4&11&\infty \end{bmatrix} G(A)= 0111101111001100 G(B)= 000101110 G(C)= 58352682104101136411

优缺点

优点:实现简单,使用方便,且容易获取每个结点的度(有向图是入度和出度),特别是有向图的出度,有手就会。
缺点:对于节点多,边数少的图来说,邻接矩阵存储很浪费空间。

以空间换时间。

数组模拟邻接表存储

图的邻接表存储法,又叫链式存储法。本来是采用链表实现的,但大多情况下只要用数组模拟即可。

优缺点

优点:随机数据下空间相对较小。
缺点:极限数据浪费空间大。

空间消耗不稳定。

边集数组优缺点

优点:更加的节约空间。
缺点:搜索时需要把所有的边枚举一遍,太浪费时间。

以时间换空间。

排序前向星优缺点

优点:更加的节约空间。
缺点:排序时间大。

以时间换空间。

链式前向星优缺点

优点:空间消耗少,速度也快。
缺点:暂无。


http://www.ppmy.cn/devtools/7979.html

相关文章

Spark和Hadoop的安装

实验内容和要求 1.安装Hadoop和Spark 进入Linux系统,完成Hadoop伪分布式模式的安装。完成Hadoop的安装以后,再安装Spark(Local模式)。 2.HDFS常用操作 使用hadoop用户名登录进入Linux系统,启动…

【AI面试】工作和面试过程中,经常遇到的其他问题汇总二(持续更新)

本篇是延续第一篇:【AI面试】工作和面试过程中,经常遇到的其他问题汇总一(持续更新) 如果你还没有看过上一篇文章,建议先去看看,尽管这两篇文章没有什么交集。 一、在CNN和transformer的训练过程中,学习率的调整,有什么经验? 在训练卷积神经网络(CNN)和Transform…

Spring Cloud 面试题(三)

1. 微服务之间如何独立通讯的? 微服务之间的独立通讯主要通过以下几种方式实现: RESTful API:这是最常用的微服务通讯方式之一。服务之间通过HTTP协议和RESTful API进行通信,实现数据交换。每个服务都提供一组RESTful API作为对外接口&…

Python基本数据结构和常见算法

Python 中的基本算法包括各种数据结构的实现和常见算法的应用。以下是 Python 中常见的基本算法及其简要介绍: ### 数据结构 1. **列表(List)**: - Python 中内置的基本数据结构,支持动态数组的操作,可…

已解决java.nio.file.FileSystemException文件系统异常的正确解决方法,亲测有效!!!

已解决java.nio.file.FileSystemException文件系统异常的正确解决方法,亲测有效!!! 目录 问题分析 报错原因 解决思路 解决方法 检查并修正文件路径和文件名 确认访问权限 检查文件占用情况 确保磁盘空间足够 排除文件系…

使用docker搭建GitLab个人开发项目私服

一、安装docker 1.更新系统 dnf update # 最后出现这个标识就说明更新系统成功 Complete!2.添加docker源 dnf config-manager --add-repohttps://download.docker.com/linux/centos/docker-ce.repo # 最后出现这个标识就说明添加成功 Adding repo from: https://download.…

软件杯 深度学习实现行人重识别 - python opencv yolo Reid

文章目录 0 前言1 课题背景2 效果展示3 行人检测4 行人重识别5 其他工具6 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 **基于深度学习的行人重识别算法研究与实现 ** 该项目较为新颖,适合作为竞赛课题方向&#xff0c…

如何在PostgreSQL中使用pg_stat_statements插件进行SQL性能统计和分析?

文章目录 一、启用pg_stat_statements插件二、查看统计信息三、定期重置统计信息四、注意事项 PostgreSQL中的pg_stat_statements是一个强大的插件,用于追踪执行时间最长的SQL语句。通过它,我们可以获取有关SQL语句执行频率、总执行时间、平均执行时间等…