【C 数据结构】图

文章目录

  • 【 1. 基本原理 】
    • 1.1 无向图
    • 1.2 有向图
    • 1.3 基本知识
  • 【 2. 图的存储结构 】
    • 2.1 完全图
    • 2.2 稀疏图和稠密图
    • 2.3 连通图
      • 2.3.1 (普通)连通图
        • 连通图 - 无向图
        • 非连通图 的 连通分量
      • 2.3.2 强连通图
        • 强连通图 - 有向图
        • 非强连通有向图 的 强连通分量
      • 2.3.3 生成树 - 连通图
      • 2.3.4 生成森林 - 非连通图

  • 不同存储结构对应的数据关系如下:
    • 线性表:一对一
    • 树:一对多
    • 图:多对多

【 1. 基本原理 】

  • 图存储结构可细分两种表现类型,分别为无向图和有向图。

1.1 无向图

  • 下图所示为存储 V1、V2、V3、V4 的 无向图 结构,从图中可以清楚的看出数据之间具有的 多对多 关系。例如,V1 与 V4 和 V2 建立着联系,V4 与 V1 和 V3 建立着联系,以此类推。
    在这里插入图片描述
  • 与链表不同,图中存储的各个数据元素被称为 顶点(而不是节点)。拿图 1 来说,该图中含有 4 个顶点,分别为顶点 V1、V2、V3 和 V4。
  • 图存储结构中,习惯上用 Vi 表示图中的顶点,且所有顶点构成的集合通常用 V 表示,如上图中顶点的集合为 V={V1,V2,V3,V4}。

1.2 有向图

  • 上图中仅是图存储结构的其中一种,数据之间 多对多 的关系还可用如下图所示的 有向图 结构表示:
    可以看到,各个顶点之间的关系并不是 双向 的。比如,V4 只与 V1 存在联系(从 V4 可直接找到 V1),而与 V3 没有直接联系;同样,V3 只与 V4 存在联系(从 V3 可直接找到 V4),而与 V1 没有直接联系,以此类推。
    • 在有向图中,每条路径或回路都是有方向的。
      在这里插入图片描述

1.3 基本知识

  • (V1,V2) 和 <V1,V2> 的区别
    • 无向图 中描述两顶点(V1 和 V2)之间的关系可以用 (V1,V2) 来表示。
    • 有向图 中描述从 V1 到 V2 的"单向"关系用 <V1,V2> 来表示。
  • 边和弧
    由于图存储结构中顶点之间的关系是用线来表示的,因此 (V1,V2) 还可以用来表示无向图中连接 V1 和 V2 的线,又称为 ;同样,<V1,V2> 也可用来表示有向图中从 V1 到 V2 带方向的线,又称为
  • 弧头和弧尾
    有向图中,无箭头一端的顶点通常被称为 初始点弧尾,箭头直线的顶点被称为终端点弧头
  • 入度和出度
    对于有向图中的一个顶点 V 来说,箭头指向 V 的弧的数量为 V 的入度(InDegree,记为 ID(V));箭头远离 V 的弧的数量为 V 的 出度(OutDegree,记为OD(V))。拿上图中的顶点 V1来说,该顶点的入度为 1,出度为 2(该顶点的度为 3)。
  • 集合 VR 的含义
    一般用 VR 表示图中所有顶点之间关系的集合。例如,上面的无向图的集合 VR={(v1,v2),(v1,v4),(v1,v3),(v3,v4)},上面有向图的集合 VR={<v1,v2>,<v1,v3>,<v3,v4>,<v4,v1>}。
  • 路径和回路
    • 无论是无向图还是有向图,从一个顶点到另一顶点途径的所有顶点组成的序列(包含这两个顶点),称为一条 路径
    • 如果路径中第一个顶点和最后一个顶点相同,则此路径称为 回路
    • 若路径中各顶点都不重复,此路径又被称为 简单路径;同样,若回路中的顶点互不重复,此回路被称为 简单回路 简单环
      拿上面的无向图 来说,从 V1 存在一条路径还可以回到 V1,此路径为 {V1,V3,V4,V1},这是一个回路(环),而且还是一个简单回路(简单环)。
  • 权和网
    在某些实际场景中,图中的每条边(或弧)会赋予一个实数来表示一定的含义,这种与边(或弧)相匹配的实数被称为 ,而带权的图通常称为 。如下图所示,就是一个网结构:
    在这里插入图片描述
  • 子图
    由图中一部分顶点和边构成的图,称为原图的 子图

【 2. 图的存储结构 】

  • 根据不同的特征,图又可分为完全图,连通图、稀疏图和稠密图:

2.1 完全图

  • 完全图:若图中各个顶点都与除自身外的其他顶点有关系,这样的无向图称为 完全图(如下图a)。同时,满足此条件的有向图则称为 有向完全图(如下图b)。
    在这里插入图片描述
  • 具有 n 个顶点的完全图,图中边的数量为 n(n-1)/2;而对于具有 n 个顶点的有向完全图,图中弧的数量为 n(n-1)。

2.2 稀疏图和稠密图

  • 稀疏图和稠密图:这两种图是相对存在的,即如果图中具有很少的边(或弧),此图就称为 稀疏图;反之,则称此图为 稠密图
  • 稀疏和稠密的判断条件
    e<nlogn,其中 e 表示图中边(或弧)的数量,n 表示图中顶点的数量,即 边的数量<nlog(顶点的数量),如果式子成立,则为稀疏图;反之为稠密图。

2.3 连通图

2.3.1 (普通)连通图

连通图 - 无向图
  • 图中从一个顶点到达另一顶点,若存在至少一条路径,则称这两个顶点是 连通 的。
    例如下图中,虽然 V1 和 V3 没有直接关联,但从 V1 到 V3 存在两条路径,分别是 V1-V2-V3 和 V1-V4-V3,因此称 V1 和 V3 之间是连通的。
    在这里插入图片描述
  • 无向图中,如果任意两个顶点之间都能够连通,则称此无向图为 连通图
    例如,下图中的无向图就是一个连通图,因为此图中任意两顶点之间都是连通的。
    在这里插入图片描述
非连通图 的 连通分量
  • 若无向图不是连通图,但图中存储某个子图符合连通图的性质,则称该子图为(非连通图的) 连通分量
    连通分量的提出是以 整个无向图不是连通图 为前提的,因为如果无向图是连通图,则其无法分解出多个最大连通子图,因为图中所有的顶点之间都是连通的。
  • 前面讲过,由图中部分顶点和边构成的图为该图的一个子图,但这里的子图指的是图中 最大 的连通子图(也称 极大连通子图 )。
    如下图所示,虽然下图 a 中的无向图不是连通图,但可以将其分解为 3 个 最大子图(下图 b),它们都满足连通图的性质,因此都是连通分量。下图 a 中的无向图只能分解为 3 部分各自连通的 最大子图。
    在这里插入图片描述

2.3.2 强连通图

强连通图 - 有向图
  • 有向图 中,若任意两个顶点 Vi 和 Vj,满足从 Vi 到 Vj 以及从 Vj 到 Vi 都连通,也就是都含有至少一条通路,则称此有向图为 强连通图 ,即 有向图中两两顶点都是通着的 。如下图所示就是一个强连通图。
    在这里插入图片描述
非强连通有向图 的 强连通分量
  • 与此同时,若有向图本身不是强连通图,但其包含的最大连通子图具有强连通图的性质,则称该子图为 强连通分量
    如下图所示,整个有向图虽不是强连通图,但其含有两个强连通分量。
    在这里插入图片描述
  • 连通图是在无向图的基础上对图中顶点之间的连通做了更高的要求强连通图是在有向图的基础上对图中顶点的连通做了更高的要求

2.3.3 生成树 - 连通图

  • 对连通图进行遍历,过程中所经过的边和顶点的组合可看做是一棵普通树,通常称为 生成树
  • 连通图中的生成树必须满足以下 2 个条件:
    ① 包含连通图中所有的顶点;
    ② 任意两顶点之间有且仅有一条通路;
  • 因此,连通图的生成树具有这样的特征,即生成树中边的数量 = 顶点数 - 1。
  • 如下图所示,下图 a 是一张连通图,下图 b 是其对应的 2 种生成树。

在这里插入图片描述

  • 连通图中,由于任意两顶点之间可能含有多条通路,遍历连通图的方式有多种,往往 一张连通图可能有多种不同的生成树与之对应

2.3.4 生成森林 - 非连通图

  • 生成树是对应连通图来说,而生成森林是对应非连通图来说的
  • 非连通图可分解为多个连通分量,而每个连通分量又各自对应多个生成树(至少是 1 棵),因此与整个非连通图相对应的,是由多棵生成树组成的 生成森林
    在这里插入图片描述
  • 如上图所示,这是一张非连通图,可分解为 3 个连通分量,其中各个连通分量对应的生成树如下图所示:
    (下图中列出的仅是各个连通分量的其中一种生成树。)
    在这里插入图片描述
  • 因此,多个连通分量对应的多棵生成树就构成了整个非连通图的生成森林。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/574200.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

美区视频带货“一哥”,一周销量狂干三十万美金!

“超店有数显示&#xff0c;Tybuggy上周带货狂揽34.3万美金&#xff0c;超出第二名近30倍。” TikTok风波再起&#xff0c;4月17日&#xff0c;美众议院推出援乌援以军事议案&#xff0c;值得注意的是&#xff0c;TikTok剥离法案被“打包”夹带其中&#xff0c;以此加大再参议…

LLM应用实战:当KBQA集成LLM(二)

1. 背景 又两周过去了&#xff0c;本qiang~依然奋斗在上周提到的项目KBQA集成LLM&#xff0c;感兴趣的可通过传送门查阅先前的文章《LLM应用实战&#xff1a;当KBQA集成LLM》。 本次又有什么更新呢&#xff1f;主要是针对上次提到的缺点进行优化改进。主要包含如下方面&#…

【Linux笔记】基本指令(一)

一道残阳铺水中 半江瑟瑟半江红 目录 Linux基本指令 罗列目录内容&#xff1a;ls 指令 显示当前目录位置信息&#xff1a;pwd 指令 切换工作目录&#xff1a;cd 指令 创建文件修改时间戳&#xff1a;touch指令 创建空目录&#xff1a;mkdir指令 删除空目录&#xff1a;rmdir指…

1.3K Star我上位机项目中用了这个开源项目

软件介绍 ClientServerProject的软件是一款基于C-S&#xff08;客户端-服务器&#xff09;架构的通用开发框架&#xff0c;为中小型系统的快速开发提供强大的支持。该框架由服务端、客户端以及公共组件三部分组成&#xff0c;不仅提供了基础的账户管理、版本控制、软件升级、公…

输入法重大漏洞曝光,仅华为幸免,近10亿用户受影响

近日&#xff0c;Citizenlab研究人员调查了多家厂商的输入法应用安全漏洞并报告称&#xff1a;除华为以外&#xff0c;百度、荣耀、科大讯飞、OPPO、三星、腾讯、Vivo和小米等供应商的九款应用程序中有八款均存在安全漏洞。 随着用户规模的不断增长&#xff0c;云输入法应用的…

kubernetes中DaemonSet控制器

一、概念 使用DaemonSet控制器&#xff0c;相当于在节点上启动了一个守护进程。通过DaemonSet控制器可以确保在每个节点上运行Pod的一个副本。如果有心的node节点加入集群&#xff0c;则DaemonSet控制器会自动给新加入的节点增加一个Pod的副本&#xff1b;反之&#xff0c;当有…

GPT的全面历史和演变:从GPT-1到GPT-4

人工智能新篇章&#xff1a;GPT-4与人类互动的未来&#xff01; 本文探讨了生成式预训练 Transformer (GPT) 的显着演变&#xff0c;提供了从开创性的 GPT-1 到复杂的 GPT-4 的旅程。 每次迭代都标志着重大的技术飞跃&#xff0c;深刻影响人工智能领域以及我们与技术的互动。 我…

vmware虚拟机网络“桥接模式”与“NAT模式”的联网原理及linux环境下IP配置指引

一、vmware虚拟机网络“桥接模式”与“NAT模式”的区别 选中虚拟机》设置》网络适配器&#xff0c;打开虚拟机设置面板 我们看到网络连接处有多个选项&#xff0c;今天良哥通过试验告诉你“桥接模式”和“NAT模式”的联网原理、区别及两种模式下IP地址配置的详细方法。 桥接模…

YOLOv9改进策略 | 添加注意力篇 | LSKAttention大核注意力机制助力极限涨点 (附多个位置添加教程)

一、本文介绍 本文给大家带来的改进机制是LSKAttention大核注意力机制应用于YOLOv9。它的主要思想是将深度卷积层的2D卷积核分解为水平和垂直1D卷积核&#xff0c;减少了计算复杂性和内存占用。接着&#xff0c;我们介绍将这一机制整合到YOLOv9的方法&#xff0c;以及它如何帮…

面试经典150题——路径总和

​ 1. 题目描述 2. 题目分析与解析 2.1 思路一 注意题目的关键点&#xff1a;判断该树中是否存在 根节点到叶子节点 的路径&#xff0c;起点是root&#xff0c;终点是叶子节点。 那么我们就可以从根节点按照层序遍历的方式&#xff0c;从根节点从根到 叶子不断对路径进行加…

MPC的横向控制与算法仿真实现

文章目录 1. 引言2. 模型预测控制&#xff08;MPC&#xff09;2.1 基础知识2.2 MPC的整体流程2.3 MPC的设计求解 3. 车辆运动学MPC设计4. 算法和仿真实现 1. 引言 随着智能交通系统和自动驾驶技术的发展&#xff0c;车辆的横向控制成为了研究的热点。横向控制指的是对车辆在行…

vue3环境搭建

环境准备&#xff1a; node环境(node.js官网)npm环境 上述两个环境存在版本要求所以安装最新的靠谱&#xff08;旧的环境存在不支持现象&#xff09; windows电脑 安装完node.js会带有npm mac电脑本身自带node和npm&#xff0c;但是需要升级 进入到你想创建前端项目的文件夹:…

C++初识内存管理和模版

目录 前言 1.C/C内存分布 2. C的内存管理方式 2.1 new/delete操作内置类型 2. new和delete操作自定义类型 3. operator new和operator delete函数 4. new和delete的实现原理 4.1 内置类型 4.2 自定义类型 5. malloc/free和new/delete的区别 6. 初识模版 6.1 泛型编…

【python笔记】datafram的时间动态可视化 pyecharts地图

import pandas as pd# 假设DataFrame是这样的&#xff1a; df pd.DataFrame({ year: [2014, 2015, 2016, 2014, 2015, 2016, 2014, 2015, 2016], province: [广东省, 广东省, 河南省, 湖南省, 北京市, 北京市, 上海市, 新疆维吾尔自治区, 上海市], values: [100, 150, 75…

井字棋源码(网络线程池版)

源码链接&#xff1a;game 效果可能没有那么好&#xff0c;大家可以给点建议。 效果展示 game.h #include <stdio.h> #include <stdlib.h> #include <time.h>#define ROW 3 #define COL 3void InitBoard(char board[ROW][COL], int row, int col) {int i…

如何在linux服务器上用Nginx部署Vue项目,以及如何部署springboot后端项目

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、打包Vue项目二、安装Nginx1.更新系统的软件包信息&#xff1a;2.安装Nginx&#xff1a;3.启动 Nginx 服务&#xff1a;安装完成后&#xff0c;Nginx 服务会…

C语言进阶:指针的进阶(上)

首先 在学习新知识之前 我们先来回顾下之前的学习的内容 1 指针是个变量 用来存放地址 地址唯一标识的一块内存空间 2 指针的大小是固定的4/8字节&#xff08;32位平台/64位平台&#xff09; 3 指针有类型的 指针的类型决定了两点 一个是指针操作的权限以及整数的步长 4 指针的…

「deepin生态共建小组」正式启动招募!三大生态共建项目,速来 !

基于社区开源精神&#xff0c;为提高大家对deepin生态建设的参与感&#xff0c;应用商店将正式开放众多软件给广大开源爱好者进行维护。参与小组工作可获得多项专属小组福利&#xff0c;工作项目分为玲珑格式迁移、wine应用打包、deb原生应用维护。 招募条件 1&#xff09;不限…

vivado Versal 串行 I/O 硬件调试流程、使用 Vivado Serial I/O Analyzer 来调试设计

Versal 串行 I/O 硬件调试流程 Versal ™ ACAP 无需再生成 IBERT IP &#xff0c; 因为使用系统内串行 I/O 调试所需的必要逻辑现已集成到 GTY 收发器架构内。使 用 GTY 收发器的任何设计均可用于串行 I/O 硬件调试。 Versal 串行 I/O 硬件调试流程具有 2 个不同阶…

蓝桥杯python考级整理

4_1:算术运算符 4_2:基本语法 4_3:基本语法 4_4:列表 4_5:函数 4_6:字符串 4_7:列表 4_8:逻辑运算符 4_9:字典 4_10:函数