当前位置: 首页 > news >正文

考研复习 Day 19 | 数据结构与算法--图(下)

一、最小生成树(MST)

最小生成树:带权连通无向图中,总权重最小的生成树。

1.1 MST的性质

性质说明
不唯一性若图中有权值相同的边,MST可能不唯一;若所有边权值互不相同,则MST唯一
总权重唯一所有MST的总权重相同,且为最小值
边数固定MST的边数 = 顶点数 - 1
注意MST中任意两点间的路径不一定是最短路径

1.2 Prim算法

核心思想:从某个顶点开始,每次选择与当前树距离最近的顶点加入。

步骤

  1. 任取一个顶点加入树T

  2. 选择与T中顶点距离最近的顶点及其最小权值边加入T

  3. 重复直到所有顶点都在T中

时间复杂度:O(n²)(与边数无关,适合稠密图

1.3 Kruskal算法

核心思想:按边权值递增顺序,每次选择不形成回路的边加入。

步骤

  1. 初始时每个顶点自成一个连通分量

  2. 按权值从小到大考察每条边

  3. 若边连接两个不同连通分量,则加入(用并查集判断)

  4. 重复直到有n-1条边

时间复杂度:O(|E| log₂|E|)(适合稀疏图


二、最短路径

2.1 Dijkstra算法(单源最短路径)

核心思想:贪心策略,每次选择当前距离最短的顶点加入集合S。

辅助数组

  • final[]:标记顶点是否已确定最短路径

  • dist[]:从源点到各顶点的当前最短路径长度

  • path[]:记录路径前驱,用于回溯

步骤

  1. 初始化:S={源点},dist[i]=arcs[源点][i]

  2. 从V-S中选dist最小的顶点j加入S

  3. 松弛操作:若dist[j]+arcs[j][k] < dist[k],则更新dist[k]

  4. 重复n-1次

时间复杂度:O(n²)(邻接矩阵)/ O(n²)(邻接表+线性扫描)

注:Dijkstra算法不适用于存在负权边的图

2.2 Floyd算法(各顶点之间最短路径)

核心思想:动态规划,逐步允许更多顶点作为中间顶点。

递推公式

A⁽ᵏ⁾[ i ] [ j ] = min(A⁽ᵏ⁻¹⁾[ i ] [ j ], A⁽ᵏ⁻¹⁾[ i ] [ k ] + A⁽ᵏ⁻¹⁾[ k ] [ j ])

  • 初始:A⁽⁻¹⁾[ i ] [ j ] = arcs[ i ] [ j ]

  • 最终:A⁽ⁿ⁻¹⁾[ i ] [ j ] 为i到j的最短路径长度

时间复杂度:O(n³)

注:Floyd算法允许负权边,但不允许负权回路

2.3 三种最短路径算法对比

算法用途适用图时间复杂度
BFS单源无权图O(n+|E|)
Dijkstra单源带权图(无负权)O(n²)
Floyd所有顶点对带权图(无负权回路)O(n³)

三、有向无环图(DAG)描述表达式

DAG:不含任何有向环路的有向图。

应用:表示含有公共子表达式的代数表达式,公共子表达式只存储一次,通过多个父结点共享,节省存储空间。


四、拓扑排序

AOV网:顶点表示活动,有向边<vᵢ, vⱼ>表示活动vᵢ必须先于vⱼ进行。

拓扑排序:将AOV网中所有顶点排成一个线性序列,满足:

  1. 每个顶点恰好出现一次

  2. 若存在从A到B的路径,则A排在B之前

拓扑排序算法

  1. 选择入度为0的顶点输出

  2. 删除该顶点及其所有出边

  3. 重复直到没有顶点(成功)或找不到入度为0的顶点(有环)

逆拓扑排序:选择出度为0的顶点输出

时间复杂度:邻接表 O(n+|E|);邻接矩阵 O(n²)

DFS实现拓扑排序:按DFS结束时间降序排列

拓扑排序的唯一性条件:每次输出时入度为0的顶点只有一个


五、关键路径

AOE网:顶点表示事件,边表示活动,边上的权值表示活动持续时间。

术语定义
源点入度为0的顶点,工程起点(唯一)
汇点出度为0的顶点,工程终点(唯一)
关键路径从源点到汇点路径长度最大的路径
关键活动关键路径上的活动

关键参数

参数含义计算公式
ve(k)事件k的最早发生时间拓扑顺序递推:ve(k)=max{ve(j)+Weight(j,k)}
vl(k)事件k的最迟发生时间逆拓扑顺序递推:vl(k)=min{vl(j)-Weight(k,j)}
e(i)活动aᵢ的最早开始时间e(i)=ve(起点)
l(i)活动aᵢ的最迟开始时间l(i)=vl(终点)-Weight
d(i)活动aᵢ的时间余量d(i)=l(i)-e(i)

关键活动d(i)=0的活动

求关键路径的步骤

  1. 拓扑顺序求 ve ()

  2. 逆拓扑顺序求 vl ()

  3. 计算所有活动的 e () 和 l ()

  4. 找出 d () = 0 的活动构成关键路径

关键路径的性质

性质说明
关键路径长度工程的最短完成时间
加快关键活动可能缩短工期,但过度缩短会导致关键路径转移
多条关键路径需加快所有关键路径上的公共关键活动才能缩短工期

六、思考

1. Prim算法 ≈ 社交圈的扩展

例如你有一个朋友圈,每次加入一个离这个圈子最近的新朋友,直到所有人都加入。这就是Prim。

2. Kruskal算法 ≈ 相亲节目配对

按心动值从小到大考虑,如果两个人不在同一对(不形成回路),就配对,直到所有人都配对成功。

3. Dijkstra算法 ≈ 外卖骑手规划

从起点出发,每次选当前能最快到达的未送餐点,然后更新其他点的最快时间。不能有负权(不能有“倒贴钱”的路线)。

4. 拓扑排序 ≈ 课程安排

学数据结构之前要先学C语言,学算法之前要先学数据结构。按依赖关系排课,就是拓扑排序。

5. 关键路径 ≈ 工程赶工期

项目的总工期由最长的依赖链决定。想提前完工,必须压缩这条链上的关键任务。


七、附录:各种图算法时间复杂度汇总

算法邻接矩阵邻接表
PrimO(n²)
KruskalO( |E|log₂|E| )
DijkstraO(n²)O(n²)
FloydO(n³)
BFS/DFSO(n²)O(n+|E|)
拓扑排序O(n²)O(n+|E|)
关键路径O(n²)O(n+|E|)

注:以上内容参考 2027年数据结构考研复习指导 王道论坛 组编,其中有一些个人想法,如有任何错误或不妥,欢迎各位大佬指出,如果各位有一些有意思的想法,也可以和我交流一下~感谢!

八、明日计划

查找算法

http://www.cnnetsun.cn/news/2071224.html

相关文章:

  • 情感分析技术:原理、实现与应用全解析
  • Model Context Protocol:机器学习模型全生命周期管理的关键
  • 别再乱用if-else了!Verilog条件语句的5个实战避坑指南(附代码对比)
  • 快手万人组织的 AI 研发范式跃迁和落地实践
  • 3分钟搞定!Windows系统显示iPhone HEIC照片缩略图终极指南
  • Betaflight飞控系统架构解析与技术实现方案
  • 如何实现微信聊天记录永久保存:WeChatMsg本地化数据管理革命
  • 2026年必知!那些便携又好带,让人欲罢不能的青岛特产!
  • Windows逆向实战:手把手教你用WinDbg和OD定位TEB结构(含FS寄存器详解)
  • 别再乱开V-Sync了!游戏开发者必懂的垂直同步原理与实战避坑指南(附OpenGL/DirectX代码)
  • Elsevier Tracker:学术投稿效率神器终极指南
  • 别再手动敲测试数据了!Vivado仿真中$readmemb/h的6种用法详解与避坑指南
  • ANSYS APDL新手避坑指南:用悬臂梁案例搞定你的第一个静力学分析
  • 如何用PodcastBulkDownloader一键备份你喜爱的播客内容?
  • 论文“瘦身”新革命:书匠策AI,让学术文字焕发新生!
  • MarkDown时序图进阶:巧用并行、条件与循环构建复杂交互逻辑
  • 手把手教你用DSP28335的定时器中断实现增量式PID控制(附完整代码)
  • 【C++26反射元编程实战图谱】:含完整UML架构设计图+AST遍历时序图+编译期契约检查模板(附GitHub私有仓库邀请码)
  • 别再手动存localStorage了!用Vue的keep-alive搞定Ruoyi后台页面状态保留(附完整配置流程)
  • 从零搭建ROS2机器人仿真环境:Gazebo+Rviz2联合调试完整指南(含传感器配置)
  • 从‘等比例缩小’到‘等效缩减’:一文看懂芯片制程演进背后的材料与结构‘魔法’
  • C23标准内存安全扩展深度解密(std::memsec.h草案+bounded_array_t+safe_ptr_t),2026年前必须掌握的5个迁移路径
  • 手搓FPGA版SoftMax:除了泰勒展开,硬件实现指数和倒数还有哪些‘骚操作’?
  • 从芯片功耗管理实战出发:手把手配置SDC中的电压岛、电平转换器与动态/静态功耗约束
  • 终极指南:如何在Windows上使用iperf3快速准确测试网络性能
  • 当AI开始互相偷密码:77万社交机器人集体裸奔,揭开Agent时代的致命漏洞
  • 别再死记硬背快排模板了!用洛谷P1177为例,图解快速排序与归并排序的核心思想与调试技巧
  • 怎样高效压缩视频图片:3步掌握CompressO跨平台压缩神器
  • 端云一体的APP热更新架构:基于小程序容器实现跨端APP热更新的技术架构分享
  • 手把手教你用Synopsys VIP回调机制监控AXI总线outstanding数(附完整代码)