24数据结构-图的基本概念与存储结构

news2024/10/7 18:23:46

目录

  • 第六章 图
  • 6.1 图的基本概念
      • 知识回顾
  • 6.2 图的储存结构(邻接矩阵法)
    • 1. 数组表示法
      • (1) 有向图,无向图的邻接矩阵
    • 2. 定义邻接矩阵的结构
    • 3. 定义图的结构
    • 4. 构造图G
    • 5. 特点

第六章 图

6.1 图的基本概念

图是一种非线性结构
在这里插入图片描述

图的特点:

  • 顶点之间的关系是任意的
  • 图中任意两个顶点之间都可能相关
  • 顶点的前驱和后继个数无限制
  1. 定义:图是一种数据元素间存在多对多关系的数据结构加上一组基本操作构成的抽象数据类型
  • 定义:图G由顶点集V和边集E组成,记为G=(V,E),其中V(G)表示图G中顶点的有限非空集;E(G)表示图G中顶点之间的关系(边)集合。若V={V1,V2,……Vn},则用|V|表示图G中顶点的个数,也称图G的阶,E={(u,v)|u∈V,v∈V},用|E|表示图G中边的条数。
  • 注意:线性表可以是空表,树可以是空树,但图不可以为空,即V一定是非空集
  • 弧头和弧尾
    <x,y>表示从顶点到顶点y的一条弧,并称x为弧尾或起始点,称y为弧头或终端点
  1. 无向图,有向图:有向图<u,v>,其中u表示弧尾,v表示弧头
  2. 简单图:简单图:①不存在重复边,② 不存在顶点到自身的边
  3. 多重图:图G中某两个结点之间的边数多于一条,又允许顶点通过同一条边和自己关联,则G为多重图。
  4. 度,入度,出度:① 无向图:在具有n个顶点,e条边的无向图中,全部顶点的度的和等于边数的2倍(一条边连两个顶点,所以一条边两个度)。②有向图:度之和入度+出度(一条边一个出度一个入度),在具有n个顶点,e条边的有向图中,入度=出度=e
  5. 路径,简单路径,路径长度:① 在路径序列中,顶点不重复出现的路径称为简单路径。②路径长度:路径上边的数目(简单就意味着顶点不重复)。
  6. 回路,简单回路:除第一个顶点和最后一个顶点外,其余顶点不重复出现的回路称为简单回路。
  7. 点到点到距离:从顶点u出发到顶点v的最短路径若存在,则此路径的长度称为u到v的距离。若u到v根本不存在路径,则记该距离为无穷(∞)
  8. 连通图,强连通图:①若图G中任意两个顶点都是连通的,则称图G为连通图(无向图中的连通就是两个顶点之间路径存在;有向图中的强连通是两个顶点之间存在往返的路径,就是w到v和v到w都有路径,强连通是有向图独有的概念),否则称为非连通图。对于n个顶点的无向图G,若G是连通图,则至少有n-1条边(就是把每个顶点都连线一个顶点,就存在路径了),若G是非连通图,则最多可能有 C n − 1 2 C_{n-1}^{2} Cn12,(就是除去一个顶点,其他顶点两两相连,只要不连接最后一个顶点,这个图就是不连通的最极端情况)。②若图中任何一项顶点都是强连通的,则称为图为强连通图。对于n个顶点的有向图G,若G是强连通图,则最少为n条边(形成回路)。
  9. 连通的补充图解:
  • 连通的最少边数:
    在这里插入图片描述
  • 不连通的最多边数:
    在这里插入图片描述
  • 强连通的最少边数
    在这里插入图片描述
  1. 子图(不用包含所有顶点)、生成子图:若包含所有顶点的子图,就称为生成子图。并不是任意几个点,任意几条边都能构成子图(例如不构成图的情况)。
    在这里插入图片描述

  2. 连通分量:无向图中极大连通子图(子图必须连通,且包含尽可能多的顶点和边)称为连通分量。
    在这里插入图片描述

  3. 强连通分量:有向图中有极大强连通子图(子图必须强连通,同时保留尽可能多的边)称为有向图的强连通分量。
    在这里插入图片描述

  4. 生成树:连通图的生成树是包含图中全部顶点的一个极小连通子图边尽可能的小,但要保持连通若图中顶点数是n,则它的生成树含有n-1条边,对于生成树而言,若砍去一条边,则会变成非连通图,若加上一条边则会形成一个回路(环)

  5. 生成森林:在非连通图中,连通分量的生成树构成了非连通图的生成森林
    在这里插入图片描述

  6. 边的权,带权图(网)
    在这里插入图片描述

  7. 无向完全图:无向图中任意两个顶点之间都存在边。

  8. 有向完全图:有向图中任意两个顶点之间都存在方向相反的两条弧。
    在这里插入图片描述

  9. 稀疏图,稠密图:这二者是相对的
    在这里插入图片描述

  10. 树:不存在回路,且连通的无向图,n个顶点的树,必有n-1条边。

  11. 有向树:一个顶点的入度为0,其余顶点的入度均有1的有向图,称为有向树。
    n个顶点的图,若|E|>n-1,则一定有回路。
    在这里插入图片描述

知识回顾

在这里插入图片描述

6.2 图的储存结构(邻接矩阵法)

在这里插入图片描述

1. 数组表示法

(1) 有向图,无向图的邻接矩阵

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

① 对于无向图,顶点vi的度是邻接矩阵中第i行(或第i列)的元素之和, TD(vi)= ∑ a[i][j]。
② 对于有向图,顶点VI的出度OD(vi)是邻接矩阵中第i行的元素之和顶点vi的出度ID(vi)是邻接矩阵中第j列)的元素之和
邻接矩阵法求顶点的度。入度。出度的时间复杂度为O(|V|)

在这里插入图片描述

2. 定义邻接矩阵的结构

#define INFINITY INT_MAX
#define MAX_VERTEXT_NUM 20
typedef enum{DG,DN,AG,AN}GraphKind;
typedef struct ArcCell{
  VRType adj;//对无向图,用0,1表示是否相邻,对于带权图,为权值
  InfoType *info;//该弧相关信息的指针

}RrcCell,AdjMatrix[MAX_VERTEXT_NUM][MAX_VERTEXT_NUM];//邻接矩阵

3. 定义图的结构

(1)代码:

//定义图的结构
typedef struct {
   VertextType exs[MAX_VERTEXT_NUM]; //顶点
   AdjMatrix arcs[MAX_VERTEXT_NUM][MAX_VERTEXT_NUM]; //边的邻接矩阵
   int vexnum,arcnum; //个数
   GraphKind kind;//有向图?无向图?
}MGraph;

在这里插入图片描述

4. 构造图G

status CreateGraph(MGraph &G)
{
    scanf(&G.kind)
    {
        case DG:return CreateDG(G);
         case DN:return CreateDN(G);
           case UDG:return CreateUDG(G);
             case UDN:return CreateDGN(G);
        default:return ERROR;
    }
}
//用无向图为例

status CreateUDN(MGraph &G)
{
    scanf(&G.arcnum,&G.vexnum,&IncInfo);//输入点数和边数
    //给顶点进行数字化编号
    for(i=0;i<G.vexnum;i++)
    { scanf(&G.exs[i]);//定义顶点数组(如果顶点本身就是1~n的数字无需这一步)
    }
    //初始化邻接矩阵
    for(i=0;i<G.vexnum;i++)
    {
        for(j=0;j<G.vexnum;j++)
        {
            G.arcs[i][j]={ININITY,NULL};
        }
    }
    //通过边数进行遍历
    for(k=0;k<G.arcnum;K++)
    {
        scanf(&V1,&V2,&W);//输入邻接的连个顶点
        i=locatteVex(G,V1);j=locateVex(G,V2);//查找V1,V2的位置
        G.arcs[i][j].adj=w;//给邻接矩阵赋值
        if(IncInfo)
        {
            INPUT(*G.arcs[i][j].info);
        }
        G.arcs[j][i]=G.arcs[i][j];//由于是无向图,对称
    }
    return ok;
}


5. 特点

优点:

  • 无向图邻接矩阵是对称矩阵,同一条边表示了两次
  • 顶点v的度:等于二维数组对应行(或列)中1的个数
  • 判断两顶点v、u是否为邻接点:只需判二维数组对应分量是否为1
  • 在图中增加、删除边:只需对二维数组对应分量赋值1或清0
  • 占用存储空间只与它的顶点数有关,与边数无关;适用于边稠密的图
  • 对有向图的数组表示法可做类似的讨论’‘

缺点:

  • 不便于删除和增加顶点(增删边简单)
  • 不便于统计边的数目,需要扫描邻接矩阵所有元素才能统计完毕,时间复杂度为O( n 2 n^2 n2 )
  • 空间复杂度高,对于有向图,n个顶点需要 n 2 n^2 n2 个单元存储边,对于无向图,n(n-1)/2个单元,空间复杂度为O( n 2 n^2 n2 )

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

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

相关文章

火山对未来气候的影响可能超出标准估计

火山未来释放的二氧化硫可能会高于目前用于气候预测的重建历史水平。 2009 年 6 月&#xff0c;国际空间站上的宇航员拍摄了俄罗斯千岛群岛萨雷切夫火山的大规模喷发。 资料来源&#xff1a;地球物理研究快报 当火山爆发时&#xff0c;它们经常向大气中喷出大量的 二氧化硫。这…

爬虫011_元组高级操作_以及字符串的切片操作---python工作笔记030

获取元组的下标对应的值 注意元组是不可以修改值的,只能获取不能修改 但是列表是可以修改值的对吧

可解释性分析的一些类别(草稿)(视觉)

目录 1.交互性解释 2. 本身具有解释性的模型 3.如何将可解释性分析应用到生成模型 参考文献 视觉领域从2020年开始可以分为两块&#xff0c;一个是图像分类&#xff0c;一个是图像生成。 图像分类&#xff1a;输入一张图片&#xff0c;输出语义标签&#xff0c;就是这张图…

uniapp引入inconfont自定义导航栏

app,h5端引入 uniapp本身的全局设置中有个iconfontsrc属性 所以只需要 1.iconfont将需要的icon添加至项目 2.下载到本地解压后,将其中的ttf文件,放在static静态目录下 3.在page.json中对全局文件进行配置tabBar(导航图标) “iconfontSrc”: “static/font/iconfont.ttf”, …

无涯教程-Perl - bless函数

描述 此函数告诉REF引用的实体,它现在是CLASSNAME包中的对象,如果省略CLASSNAME,则为当前包中的对象。建议使用bless的两个参数形式。 语法 以下是此函数的简单语法- bless REF, CLASSNAMEbless REF返回值 该函数返回对祝福到CLASSNAME中的对象的引用。 例 以下是显示其…

​白色塑料瓶高度机器视觉测量​软硬件方案-康耐德

【检测目的】 白色塑料瓶高度机器视觉测量 【检测要求】 测量精度为1.2mm 【检测目的】 【效果及处理图片】 【方案评估】 以目前样品的图像效果及处理结果来说&#xff0c;我们是可以对其高度进行测量的。如果其他类型或者更高精度要求的样品&#xff0c;需要进行实验才能确…

Docker 快速安装 MinIO

概述 MinIO 是一款基于Go语言的高性能对象存储服务&#xff0c;非常适合于存储大容量非结构化的数据&#xff0c;例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等。 拉取docker镜像 docker pull minio/minio创建宿主机数据目录&#xff08;共享数据卷&#xff09; 此…

2023-08-07 vmvare安装ubuntu18.04 ,安装VMware Tools后剪贴板无法共享问题

一、安装VMware Tools死活不行&#xff0c;不能跟主机共享粘贴板&#xff0c;解决方法 1.安装open-vm-toolssudo apt install open-vm-tools2.安装open-vm-toolssudo apt install open-vm-tools-desktop 二、实际操作&#xff0c;可以跟windows主机互相复制粘贴&#xff0c;非…

hdu Pair Sum and Perfect Square

题意&#xff1a; 给你一个1~n组成的排列p&#xff0c;有q个询问&#xff0c;每次询问[l,r]之间有多少对i和j满足pipj是平方数&#xff08;i<j&#xff09; 思路&#xff1a; 用树状数组来解决 先将询问的区间按右端点从小到大&#xff0c;左端点从小到大的顺序排序 我…

【Java可执行命令】(十七)JVM运行时信息动态维护工具 jinfo:一个维护 JVM 相关的配置参数和系统属性的工具,辅助故障排除、诊断和优化 ~

Java可执行命令之jinfo 1️⃣ 概念2️⃣ 优势和缺点3️⃣ 使用3.1 语法格式3.2 -flags&#xff1a;查看进程的启动参数3.3 -sysprops&#xff1a;查看进程的系统属性3.4 -flag < name>&#xff1a;查看特定虚拟机参数的值3.5 -flag [/-]< name>&#xff1a;启用或禁…

查看gz文件 linux zcat file.gz mtx.gz

可以使用以下命令来查看 gz 压缩文件的内容&#xff1a; zcat file.gz 1 该命令会将 file.gz 文件解压并输出到标准输出&#xff0c;可以通过管道符将其与 grep 命令结合使用来查找需要的关键词&#xff0c;例如&#xff1a; zcat file.gz | grep keyword 1 该命令会将 file.gz…

JS进阶-Day4

&#x1f954;&#xff1a;流水不争先争滔滔不绝 JS进阶-Day1——点击此处&#xff08;作用域、函数、解构赋值等&#xff09; JS进阶-Day2——点击此处&#xff08;深入对象之构造函数、实例成员、静态成员等&#xff1b;内置构造函数之引用类型、包装类型等&#xff09; JS进…

【积水成渊】uniapp高级玩法分享

大家好&#xff0c;我是csdn的博主&#xff1a;lqj_本人 这是我的个人博客主页&#xff1a; lqj_本人_python人工智能视觉&#xff08;opencv&#xff09;从入门到实战,前端,微信小程序-CSDN博客 最新的uniapp毕业设计专栏也放在下方了&#xff1a; https://blog.csdn.net/lbcy…

iOS永久签名工具 - 轻松签使用教程

轻松签是一款IOS端免费的IPA签名和安装工具&#xff0c;最新版可以不用依赖证书对ipa永久签名&#xff0c;虽然现在用上了巨魔&#xff08;TrollStore&#xff09;- 是国外iOS开发人员opa334dev发布的一款工具&#xff0c;可以在不越狱的情况下&#xff0c;安装任何一款APP。 …

Tcp是怎样进行可靠准确的传输数据包的?

概述 很多时候&#xff0c;我们都在说Tcp协议&#xff0c;Tcp协议解决了什么问题&#xff0c;在实际工作中有什么具体的意义&#xff0c;想到了这些我想你的技术会更有所提升&#xff0c;Tcp协议是程序员编程中的最重要的一块基石&#xff0c;Tcp是怎样进行可靠准确的传输数据…

docker 配置 Mysql主从集群

Docker version 20.10.17, build 100c701 MySQL Image version: 8.0.32 Docker container mysql-master is source. mys ql-replica is replication. master source. replica slave.名称叫法不一样而已。 Choose one of the way&#xff0c;与replica同步数据两种情况&…

从 TCP/IP 到 CCIP:Chainlink 与合约的互联网

未来已来。通过链上金融重塑资本市场预计将影响全球价值 8.67 万亿美元的资产的使用方式。 Chainlink 的跨链互操作性协议&#xff08;CCIP&#xff09;将会这一转型过程中发挥重要作用&#xff0c;这是区块链连接性和互操作性的突破&#xff0c;使得 DeFi 应用可以通过单一界…

【Docker】Windows下docker环境搭建及解决使用非官方终端时的连接问题

目录 背景 Windows Docker 安装 安装docker toolbox cmder 解决cmder 连接失败问题 资料获取方法 背景 时常有容器方面的需求&#xff0c;经常构建调试导致测试环境有些混乱&#xff0c;所以想在本地构建一套环境&#xff0c;镜像调试稳定后再放到测试环境中。 Windows …

【SAP-MDG】MDG配置-激活事件类型链接 Activate Event Type Linkage

路径&#xff1a;MDGIMG→General Settings→Process Modeling→Workflow→Activate Event Type Linkage. 路径&#xff1a;MDGIMG→常规设置→流程建模→工作流→激活时间类型链接. MDG是自带工作流的&#xff0c;所以根据《MDG配置手册》中&#xff0c;是需要激活此功能的 第…

【Linux】结合Python 简易实现监控公司网站,邮件发送异常

目录 背景 实现思路 邮件4小时内只会发送一次&#xff0c;如果执行了发送邮件的脚本&#xff0c;就使用sed命令将对应的调用代码置为无效 请求脚本 Python邮件发送脚本 定时任务设置 恢复邮件发送能力脚本 资料获取方法 背景 由于一些原因&#xff0c;博主负责测试的网…