数据结构:图论入门
图论起源于欧拉对哥尼斯堡七桥问题的解决. 他构建的图模型将陆地用点来表示, 桥梁则用线表示, 如此一来, 该问题便转化为在图中能否不重复地遍历每条边的问题.
图论的应用
地图着色
在地图着色问题中, 我们用顶点代表国家, 将相邻国家之间用边相连. 这样, 问题就转化为用最少的颜色给图的顶点着色, 同时要保证相邻顶点的颜色不同. 四色定理表明, 任何地图都可以用四种颜色进行着色.
频率分配
以顶点表示发射机, 将干扰范围内的发射机之间用边相连. 频率分配问题就可以转化为给顶点标记数字, 使得相邻顶点标记的数字差值尽可能大.
燃气供应
利用平面图进行建模, 其中顶点表示路口, 边表示道路, 面表示区域. 通过寻找最小面生成子图, 能够确定铺设燃气管道的最优道路网络, 从而实现成本的最小化.
布局规划
在 VLSI(超大规模集成电路)和建筑布局规划中, 用图来表示模块或房间之间的连接关系. 通过对平面图进行三角剖分, 构建对偶图并绘制矩形图, 从而得到布局方案.
其他应用
图论还广泛应用于万维网社区发现, 生物信息学(如 RNA 结构描述), 软件工程(如控制流图用于软件测试)等诸多领域.
图的基本概念
图的定义
图(Graph)
一个图 G G G由两个集合组成, 即顶点集 V ( G ) V(G) V(G)和边集 E ( G ) E(G) E(G), 通常记为 G = ( V , E ) G=(V, E) G=(V,E). 顶点(Vertex, 也称为节点 Node)是图的基本元素, 用于表示研究的对象; 边(Edge)是连接两个顶点的线, 用于表示对象之间的关系. 若图中无自环边( 从 v v v 到 v v v ) 且无重边(两个节点之间存在多条边), 则为简单图, 反之则为多重图.
顶点(Vertex)
顶点是图中的基本元素, 即图的节点. 顶点可以有自己的属性, 例如在社交网络的图模型中, 顶点代表用户, 每个顶点可能包含用户的年龄, 性别等属性信息.
边(Edge)
边是连接两个顶点的线. 根据边是否有方向, 图可分为无向图和有向图. 在无向图中, 边没有方向, 若顶点 u u u和 v v v之间有边, 则表示为 ( u , v ) (u, v) (u,v), 且 ( u , v ) (u, v) (u,v)和 ( v , u ) (v, u) (v,u)表示同一条边; 在有向图中, 边有方向, 从顶点 u u u指向顶点 v v v的边表示为 ( u , v ) (u, v) (u,v), 它与从 v v v指向 u u u的边 ( v , u ) (v, u) (v,u)是不同的边.
邻接(Adjacency)
在无向图中, 如果两个顶点 u u u和 v v v之间有一条边 ( u , v ) (u, v) (u,v), 则称顶点 u u u和 v v v是邻接的; 在有向图中, 如果存在一条从顶点 u u u到顶点 v v v的有向边 ( u , v ) (u, v) (u,v), 则称顶点 u u u邻接到顶点 v v v, 顶点 v v v邻接自顶点 u u u.
度(Degree)
对于无向图中的一个顶点 v v v, 它的度是与该顶点相关联的边的数量, 记为 d ( v ) d(v) d(v); 在有向图中, 顶点的度分为入度和出度. 入度(In - degree)是指以该顶点为终点的有向边的数量, 记为 d − ( v ) d^-(v) d−(v), 出度(Out - degree)是指以该顶点为起点的有向边的数量, 记为 d + ( v ) d^+(v) d+(v), 顶点 v v v的度等于其入度与出度之和, 即 d ( v ) = d − ( v ) + d + ( v ) d(v)=d^-(v) + d^+(v) d(v)=d−(v)+d+(v).
路径(Path)
在图中, 从一个顶点 v 0 v_0 v0开始, 依次经过一系列相邻的顶点 v 1 , v 2 , ⋯ , v n v_1, v_2, \cdots, v_n v1,v2,⋯,vn所形成的顶点序列, 其中 ( v i − 1 , v i ) ∈ E (v_{i - 1}, v_i) \in E (vi−1,vi)∈E(对于无向图)或 ( v i − 1 , v i ) ∈ E (v_{i - 1}, v_i) \in E (vi−1,vi)∈E(对于有向图, i = 1 , 2 , ⋯ , n i = 1, 2, \cdots, n i=1,2,⋯,n), 这个顶点序列就称为从 v 0 v_0 v0到 v n v_n vn的路径. 路径中边的数量称为路径的长度.
回路(Cycle)
在图中, 起点和终点相同的路径称为回路, 也叫环. 也就是说, 如果路径 v 0 , v 1 , ⋯ , v n v_0, v_1, \cdots, v_n v0,v1,⋯,vn满足 v 0 = v n v_0 = v_n v0=vn且 n ≥ 1 n \geq 1 n≥1, 则它是一个回路.
连通图(Connected Graph)
在无向图中, 如果对于图中的任意两个顶点 u u u和 v v v, 都存在一条从 u u u到 v v v的路径, 则称该图是连通图; 在有向图中, 如果对于图中的任意两个顶点 u u u和 v v v, 都存在从 u u u到 v v v的路径以及从 v v v到 u u u的路径, 则称该有向图是强连通图. 如果一个有向图不是强连通图, 但忽略边的方向后得到的无向图是连通图, 则称该有向图是弱连通图.
子图(Subgraph)
给定一个图 G = ( V , E ) G=(V, E) G=(V,E), 如果存在另一个图 G ′ = ( V ′ , E ′ ) G'=(V', E') G′=(V′,E′), 其中 V ′ ⊆ V V'\subseteq V V′⊆V( V ′ V' V′是 V V V的子集)且 E ′ ⊆ E E'\subseteq E E′⊆E( E ′ E' E′是 E E E的子集), 并且 E ′ E' E′中的边所关联的顶点都在 V ′ V' V′中, 则称 G ′ G' G′是 G G G的子图.
树(Tree)
无向连通且无回路的图称为树. 树中度数为 1 的顶点称为叶子节点, 其他顶点称为内部节点. 在树中, 任意两个顶点之间恰好存在一条路径. 有根树是一种特殊的树, 它有一个被指定为根的顶点, 从根到其他顶点有唯一的路径.
图的分类
正则图
所有顶点度相等的图是正则图, 当度为 k k k时, 称为 k − k - k−正则图. 例如, 零图是 0 − 0 - 0−正则图, 简单循环是 2 − 2 - 2−正则图, 彼得森图是 3 − 3 - 3−正则图, 还有 5 − 5 - 5−正则的甜甜圈图和 d − d - d−维超立方体等.
子图
图 G = ( V , E ) G=(V, E) G=(V,E)的子图 G ′ = ( V ′ , E ′ ) G'=(V', E') G′=(V′,E′)满足 V ′ ⊆ V V' \subseteq V V′⊆V且 E ′ ⊆ E E' \subseteq E E′⊆E. 可以通过删除顶点或边得到子图, 如 G − e G - e G−e, G − v G - v G−v . 还有顶点集或边集诱导的子图, 如 G [ W ] G[W] G[W] , G [ F ] G[F] G[F] .
特殊图类
包括空图(边集为空, 记为 N n N_{n} Nn ), 完全图(任意两顶点相邻, K n K_{n} Kn有 n ( n − 1 ) / 2 n(n - 1)/2 n(n−1)/2条边), 独立集和二分图(顶点集可分成两个独立子集, 完全二分图 K m , n K_{m,n} Km,n有 m × n m×n m×n条边), 路径图( P n P_{n} Pn除端点外顶点度为 2 ), 循环图( C n C_{n} Cn所有顶点度为 2 ), 轮图( W n W_{n} Wn由 C n − 1 C_{n - 1} Cn−1加新顶点连接所有 C n − 1 C_{n - 1} Cn−1顶点得到).
图的操作
图的运算
- 集合运算: 图 G 1 G_{1} G1和 G 2 G_{2} G2的并集 G 1 ∪ G 2 G_{1} \cup G_{2} G1∪G2顶点集为 V 1 ∪ V 2 V_{1} \cup V_{2} V1∪V2 , 边集为 E 1 ∪ E 2 E_{1} \cup E_{2} E1∪E2; 交集 G 1 ∩ G 2 G_{1} \cap G_{2} G1∩G2顶点集为 V 1 ∩ V 2 V_{1} \cap V_{2} V1∩V2 , 边集为 E 1 ∩ E 2 E_{1} \cap E_{2} E1∩E2 .
- 其他运算: 图 G G G的补图 G ˉ \bar{G} Gˉ与 G G G顶点集相同, 两顶点在 G ˉ \bar{G} Gˉ中有边当且仅当在 G G G中无边; 细分是删边并通过新顶点添加路径; 收缩边是删边并合并两顶点.
图同构
图 G 1 G_{1} G1和 G 2 G_{2} G2间存在一一对应关系, 使对应顶点间边数相等, 则两图同构, 记为 G 1 ≅ G 2 G_{1} \cong G_{2} G1≅G2 . 同构关系是等价关系, 判断图同构目前尚无多项式时间算法.
度序列
图的度序列是顶点度的非增排列, 满足度和公式(和为偶数)的序列可能是图的度序列, 简单图的度序列叫图序列, 可通过递归算法判断.
数据结构与图的表示
邻接矩阵
邻接矩阵是 n × n n×n n×n矩阵, 元素为两顶点间边数, 简单图邻接矩阵元素为 0 或 1 , 主对角线为 0 , 空间复杂度 O ( n 2 ) O(n^{2}) O(n2) ; 关联矩阵是 n × m n×m n×m矩阵, 元素表示顶点与边是否关联, 空间复杂度 n × m n×m n×m ; 邻接表是数组, 每个顶点对应一个包含其邻居记录的列表, 空间复杂度 O ( n + m ) O(n + m) O(n+m) .
邻接表
用数组存储顶点的邻接顶点列表, 空间复杂度 O ( n + m ) O(n + m) O(n+m) , 适用于边数较少的图.
相关文章:
数据结构:图论入门
图论起源于欧拉对哥尼斯堡七桥问题的解决. 他构建的图模型将陆地用点来表示, 桥梁则用线表示, 如此一来, 该问题便转化为在图中能否不重复地遍历每条边的问题. 图论的应用 地图着色 在地图着色问题中, 我们用顶点代表国家, 将相邻国家之间用边相连. 这样, 问题就转化为用最少…...
【R语言】方差分析
一、基本术语 在R语言以及更广泛的统计学领域中,方差分析(ANOVA,即Analysis of Variance)是一种用于比较两个或更多组数据的均值是否存在显著差异的统计方法。可以使用aov()函数或其他相关函数(如anova())…...
区块链+隐私计算:长安链多方计算合约标准协议(CMMPC-1)发布
建设背景 长安链与隐私计算的深度融合是构建分布式数据与价值流通网络的关键基石,可以在有效连接多元参与主体的同时确保数据的分布式、可追溯、可计算,以及隐私性与安全性。在长安链与隐私计算的融合实践中,开源社区提炼并抽象出多方计算场…...
#渗透测试#批量漏洞挖掘#Crocus系统—Download 文件读取
免责声明 本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停…...
HAL库USART中断接收的相关问题
文章目录 一、使用中断的步骤二、相关函数分析1、HAL_UART_IRQHandler2、UART_Receive_IT3、HAL_UART_Receive_IT4、UART_Start_Receive_IT5、总结 三、HAL库使用心得 一、使用中断的步骤 1、配置GPIO 2、配置USART1 3、设置UART1中断优先级(不开启手动中断&#x…...
顺序表(C)
1.顺序表的概念 顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,通常借助数组来实现。它的特点是逻辑上相邻的元素在物理存储位置上也相邻,支持随机访问,可通过下标直接访问任意位置的元素。不过,顺序表在插入和…...
Polkadot-API (PAPI) 简介与使用指南
在 Polkadot 生态系统中,去中心化应用(dApp)、网页和钱包的开发者通常使用 JavaScript 和 TypeScript 进行开发。与基于 Polkadot SDK 的区块链进行交互,传统上主要依赖于 Polkadot JS 库。然而,最近波卡生态中出现了一…...
LabVIEW用户界面设计原则
在LabVIEW开发中,用户界面(UI)设计不仅仅是为了美观,它直接关系到用户的操作效率和体验。一个直观、简洁、易于使用的界面能够大大提升软件的可用性,尤其是在复杂的实验或工业应用中。设计良好的UI能够减少操作错误&am…...
Java中的synchronized:使用与锁升级机制
在Java并发编程中,synchronized关键字是实现线程同步的重要工具。它能够确保多个线程在访问共享资源时的线程安全性。随着Java版本的更新,synchronized的底层实现也在不断优化,尤其是引入了锁升级机制,显著提高了性能。本文将详细…...
简述MySQL主从复制原理及其工作过程,配置一主两从并验证
MySQL主从复制原理:MySQL主从复制是一种常用的数据同步技术,它通过将一个MySQL数据库服务器(主服务器)的数据实时复制到一个或多个从服务器,从而实现数据的备份、读写分离以及高可用性等目标. 基于binlog的主从同步 #主服务器配…...
MySQL8.0 innodb Cluster 高可用集群部署(MySQL、MySQL Shell、MySQL Router安装)
简介 MySQL InnoDB集群(Cluster)提供了一个集成的,本地的,HA解决方案。Mysq Innodb Cluster是利用组复制的 pxos 协议,保障数据一致性,组复制支持单主模式和多主模式。 InnoDB Cluster组件: …...
【时时三省】(C语言基础)简单的算法举例
山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省 判定2000—2500年中的每一年是否为闰年,并将结果输出。 本先分析闰年的条件: (1)能被4整除,但不能被100整除的年份都是闰年&…...
走进 Tcl 语言:历史、特性与应用
亲爱的小伙伴们😘,在求知的漫漫旅途中,若你对深度学习的奥秘、Java 与 Python 的奇妙世界,亦或是读研论文的撰写攻略有所探寻🧐,那不妨给我一个小小的关注吧🥰。我会精心筹备,在未来…...
Day42(补)【AI思考】-编译过程中语法分析及递归子程序分析法的系统性解析
文章目录 编译过程中语法分析及递归子程序分析法的系统性解析**一、总览:编译流程中的语法分析****1. 编译过程核心步骤** **二、语法分析的核心任务****1. 核心目标****2. 现实类比** **三、递归子程序分析法的本质****1. 方法分类****2. 递归子程序分析法的运作原…...
Effective Objective-C 2.0 读书笔记——内存管理(上)
Effective Objective-C 2.0 读书笔记——内存管理(上) 文章目录 Effective Objective-C 2.0 读书笔记——内存管理(上)引用计数属性存取方法中的内存管理autorelease保留环 ARCARC必须遵循的方法命名原则ARC 的自动优化࿱…...
软件测试覆盖率详解
🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快 一、覆盖率概念 覆盖率是用来度量测试完整性的一个手段,是测试技术有效性的一个度量。分为:白盒覆盖、灰盒覆盖和黑盒覆盖;测…...
控制玉米株高基因 PHR1 的基因克隆
https://zwxb.chinacrops.org/CN/10.3724/SP.J.1006.2024.33011...
windows10本地的JMeter+Influxdb+Grafana压测性能测试,【亲测,避坑】
一、环境,以下软件需要解压、安装到电脑上。 windows10 apache-jmeter-5.6.3 jdk-17.0.13 influxdb2-2.7.11 grafana-enterprise-11.5.1二、配置Influxdb,安装完默认连接http://localhost:8086/。打开连接,配置如下。 开启Influxdb…...
那些数据库函数那些事儿
stdio 1.基本概念 文件: 一组相关数据的集合 文件名: 01.sh //文件名 2.linux下的文件类型 b block 块设备文件 eg: 硬盘 c character 字符设备文件 eg: 鼠标,键盘 d directory 目录文件 eg: 文件夹 - regular 常…...
Excel中不用复杂公式根据指定X列的数值N复制整行数据N行简单方法
Excel中不用复杂公式根据指定X列的数值N复制整行数据N行简单方法 1、在“数据表”sheet1中对指定X列(假设X列的数字从X2开始到Xn结束)求和,和为Y。 2、在“数据表”sheet1数据列之外新建一列Z,Z1输入表头“匹配数据列”ÿ…...
如何在 Java 后端接口中提取请求头中的 Cookie 和 Token
个人名片 🎓作者简介:java领域优质创作者 🌐个人主页:码农阿豪 📞工作室:新空间代码工作室(提供各种软件服务) 💌个人邮箱:[2435024119qq.com] 📱个人微信&a…...
【Python网络爬虫】爬取网站图片实战
【Python网络爬虫】爬取网站图片实战 Scrapying Images on Website in Action By Jackson@ML *声明:本文简要介绍如何利用Python爬取网站数据图片,仅供学习交流。如涉及敏感图片或者违禁事项,请注意规避;笔者不承担相关责任。 1. 创建Python项目 1) 获取和安装最新版…...
SAP ABAP VA05增强
SE18 输入增强的BADI名称:BADI_SDOC_WRAPPER 进入后,点击Interface。 进入后,点击显示对象清单。 双击增强类,下面有之前做好的增强类,没有的可以自己创建一个。 IF_BADI_SDOC_WRAPPER~ADAPT_RESULT_COMP 代码 METHOD if_badi_sdoc_wrapper~adapt_result_comp."…...
八大排序——简单选择排序
目录 1.1基本操作: 1.2动态图: 1.3代码: 代码解释 1. main 方法 2. selectSort 方法 示例运行过程 初始数组 每轮排序后的数组 最终排序结果 代码总结 1.1基本操作: 选择排序(select sorting)也…...
【清晰教程】本地部署DeepSeek-r1模型
【清晰教程】通过Docker为本地DeepSeek-r1部署WebUI界面-CSDN博客 目录 Ollama 安装Ollama DeepSeek-r1模型 安装DeepSeek-r1模型 Ollama Ollama 是一个开源工具,专注于简化大型语言模型(LLMs)的本地部署和管理。它允许用户在本地计算机…...
教程 | Proxmox VE(PVE)安装全流程指南(末尾附镜像及快速配置脚本)
Proxmox VE 是一款基于 Debian 的开源虚拟化平台,支持 KVM 虚拟机和 LXC 容器,广泛用于企业级虚拟化部署。 一、安装前准备 1. 硬件要求 CPU:64位处理器(Intel VT/AMD-V 虚拟化支持)内存:至少 4GB&#x…...
【matlab优化算法-17期】基于DBO算法的微电网多目标优化调度
基于蜣螂DBO算法的微电网多目标优化调度 一、前言 微电网作为智能电网的重要组成部分,其优化调度对于降低能耗、减少环境污染具有重要意义。本文介绍了一个基于Dung Beetle Optimizer(DBO)算法的微电网多目标优化调度项目,旨在通…...
如何使用qt开发一个xml发票浏览器,实现按发票样式显示
使用Qt开发一个按发票样式显示的XML发票浏览器,如下图所示样式: 一、需求: 1、按税务发票样式显示。 2、拖入即可显示。 3、正确解析xml文件。 二、实现 可以按照以下步骤进行: 1. 创建Qt项目 打开Qt Creator,创…...
八股文-2025-02-12
BFC BFC属于普通流。BFC全称是Block Formatting Context,意思就是块级格式化上下文。你可以把BFC看做元素的一个属性,当元素拥有BFC属性,这个元素就可以看作是隔离了的独立容器,容器里边的元素不会影响到容器外部的元素.https://b…...
解析 JavaScript 面试题:`index | 0` 确保数组索引为整数
文章目录 一、JavaScript 中的数字类型二、按位或运算符 | 的作用(一)对于整数(二)对于小数(三)对于非数字值 三、用于数组索引的意义 在 JavaScript 面试中,常常会涉及到一些看似简单却蕴含着深…...
