【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.mzph.cn/pingmian/3375.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Jenkins构建实用场景指南

1 总体说明 本文主要介绍在研发实战时,通过Jenkins解决企业级软件构建打包一些实用场景。通常是在打包构建前,通过命令和工具进行预处理,避免修改源码,可按需配置构建任务,自动持续集成。 2 Jenkins简介 2.1 复制任务 研发实战创建构建任务,推荐从已有的构建任务进行…

windows查看xxx的版本号

node -v python --version redis-server --version java -version go version mvn -version git --version

商标申请注册交费就一定会下注册证?

近日遇到一个网友说普推知产老杨说&#xff0c;他以为商标交钱就一定会下商标注册证&#xff0c;这个不管找哪家也做不到的。商标申请注册时要给商标局交费用&#xff0c;交完费用商标才有商标的形式审查&#xff0c;通过后下受理书&#xff0c;才有后面商标实质审查&#xff0…

基础SQL 函数

在MySQL中内置了很多函数&#xff0c;我们可以通过一段程序或者代码直接调用这个函数 一、字符串函数 下面通过例子来验证这些函数 -- 字符串函数-- concat函数 select concat("hello ","world");-- lower函数 select lower("HELLO");-- upper函…

C#基础|构造方法相关

哈喽&#xff0c;你好&#xff0c;我是雷工。 以下为C#方法相关的学习笔记。 01 方法的概述 概念&#xff1a;方法表示这个对象能够做什么&#xff0c;也就是封装了这个对象行为。 类型&#xff1a;实例方法—>静态方法&#xff08;抽象方法、虚方法&#xff09;—>特殊…

CSS画一条虚线,并且灵活设置虚线的宽度和虚线之间的间隔和虚线的颜色

CSS画一条虚线,并且灵活设置虚线的宽度和虚线之间的间隔和虚线的颜色。 先看效果图&#xff1a; 在CSS中&#xff0c;你可以使用border属性或者background属性来画一条虚线。以下是两种常见的方法&#xff1a; 方法一&#xff1a;使用border属性 你可以设置一个元素的border…

别再把ERP吹上天了,在中国根本没几家企业用得起来

ERP系统无疑具有诸多优势&#xff0c;然而&#xff0c;其在中国多年的应用实效如何&#xff0c;各界看法不一&#xff0c;尚无定论。 历经长达20余年的信息化探索&#xff0c;华为直至2016年才达成了“流程基本顺畅&#xff0c;账目与实际相符”的目标&#xff08;详见华为轮值…

张大哥笔记:如何选择一个好项目?

互联网已经改变了我们的日常生活&#xff0c;使我们可以便捷地获取信息&#xff0c;更快地完成工作&#xff0c;更有效地进行沟通&#xff0c;并且可以让我们更容易地获得服务。随着技术的发展&#xff0c;互联网将继续改变我们的生活.... 有时候我们会感叹&#xff0c;互联网发…

群组分析方法

目录 1.什么是群组分析方法 2.基本原理 3.群组分析方法分类 3.1.层次方法 3.2.划分方法 3.3.密度基方法 ​​​​​​​3.4.模型基方法 4.群组评估 5.应用步骤 1.什么是群组分析方法 群组分析&#xff08;Cluster Analysis&#xff09;是数据分析中的一种重要方法&…

VMWare vmdk文件非常大解决

你如果发现你的虚拟机占用了几百个GB的空间想要变小&#xff0c;在我使用电脑中有一个虚拟机放在了D盘的vm7.9文件夹中。D盘总容量为1TB,但是扯淡的是一个虚拟机占用了600多个GB空间&#xff0c;我按照下面流程执行了最终变为了使用200多GB。 虚拟机经过长时间使用以及各种操作…

北航计算机软件技术基础课程作业笔记【5】

题目 (文章一周后公开~) sort 1.快排算法 核心思路:选取(一般是)当前数组第一个元素作为中间值mid,将数组按照比mid小/大分为两半,再对子数组进行同样操作(二叉树前序遍历) 具体操作:主要是分2半那里,可以巧妙一些地来遍历,所以用到了left和right指针(重合时就遍…

【Redis】面试题汇总

Redis什么是Redis、使用场景有哪些Redis 为什么这么快&#xff1f;Redis 数据类型及使用场景五种常见的 Redis 数据类型是怎么实现&#xff1f;Redis是单线程吗Redis 采用单线程为什么还这么快&#xff1f;Redis 如何实现数据不丢失&#xff1f;Redis 如何实现服务高可用&#…

基于Linux的Ncurse库的贪吃蛇项目

贪吃蛇项目的意义 承上启下&#xff1a;从C语言基础的学习&#xff1a;数据结构链表基础、C变量、流程控制、函数、指针、结构体等。过渡到Linux系统编程&#xff1a;文件编程、进程、线程、通信、第三方等。 Linux终端图形库curses curses的名字起源于"cursor optimiz…

Oracle Analytics BIEE 操作方法(五)仪表盘导出“区域”不换行也不合并居中的方法

1 分析 取消所有区域内列格式里面的换行 2 仪表盘 点击“工具” 打印和导出选项 设置固定列宽&#xff08;范围是&#xff1a;0-300&#xff09;

Day22 SSH远程管理服务

sshd服务&#xff0c;系统自带&#xff0c;默认开机自启运行 云/物理服务器的安全组和防火墙默认放行该端口 软件包&#xff1a;openssh-server&#xff08;服务端&#xff09;&#xff1b;openssh-client&#xff08;客户端&#xff09;&#xff1b; 格式&#xff1a;ssh I…

【学习笔记二十七】EWM存储类型控制

一、EWM存储类型控制概述 Storage control 是用来决定仓库产品移动时所需要的流程步骤。它的目的是用来处理基于仓库物理布局及仓库流程所要求的复杂的上架和下架流程步骤。 仓库里常见的操作步骤有:Picking、Packing、Staging、Loading、Putaway、Unloading、Counting、Quali…

Jetbrains Fleet这十个快捷键,效率提高50倍

当我们无法解决一段感情中的问题 就会选择解决这段感情 如果真诚不得到回应 那么再热情的人 也会沉默 很多人对你感兴趣 却没有人执着于你 我们知道任何一款牛批的IDE 都是有很多快捷键的&#xff0c;但是我们没有superpower &#xff0c;不能记住所有的快捷键。 所以下面…

成功密码期刊投稿简介

《成功密码》综合版是由国家新闻出版总署批准&#xff0c;江西省教育厅主管的正规期刊&#xff0c;"以培养担当民族复兴大任的时代新人为着眼点&#xff0c;强化教育引导、实践养成、制度保障"&#xff0c;倡导教育研究的学术水准&#xff0c;注重理论与实践的有机结…

Delphi 的Show和ShowModal

Show没有返回值是一个过程&#xff0c;焦点可以不在当前窗体&#xff1b; 用法新建一个子窗体&#xff1a; 主窗体&#xff1a; 调用&#xff0c;引用子窗体的单元 调用 showmodal是一个函数有返回值&#xff0c;窗体的处理结果&#xff0c;且只能聚焦到当前窗体 效果都能展示…

尺取法知识点讲解

一、固定长度的情况&#xff1a; 最小和(sum) 输入N个数的数列&#xff0c;所有相邻的M个数的和共有N-M1个&#xff0c;求其中的最小值。 输入格式 第1行&#xff0c;2个整数N&#xff0c;M&#xff0c;范围在[3…100000]&#xff0c;N>M。 第2行&#xff0c;有N个正…