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

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

一、图的基本概念1.1 图的定义图G由顶点集V和边集E组成记为G(V,E)要素说明V(G)顶点的有限非空集E(G)顶点之间关系的集合重要线性表可以是空表树可以是空树但图不可以是空图。顶点集V必须非空但边集E可以为空。1.2 基本术语1. 有向图 vs 无向图类型边的形式说明有向图v, wv称为弧尾w称为弧头表示v→w无向图(v, w)或(w, v)v和w互为邻接点2. 简单图 vs 多重图类型条件简单图① 不存在重复边② 不存在顶点到自身的边多重图两顶点之间边数可超过1条允许顶点通过边与自身关联这里仅讨论简单图。3. 顶点的度、入度、出度图类型定义重要结论无向图度TD(v) 依附于v的边数所有顶点的度之和 2|E|有向图入度ID(v) 以v为终点的边数出度OD(v) 以v为起点的边数所有顶点的入度之和 出度之和 |E|注符号含义对照表符号含义类型举例E边集Edge Set集合E {(A,B), (B,C)}|E|边的条数数字|E| 2很多人会偷懒直接用E表示边数但它本质上是|E|。顶点v的度TD(v) ID(v) OD(v)4. 路径与回路术语定义路径顶点序列v₀, v₁, …, vₙ路径长度路径上边的数量回路环第一个顶点和最后一个顶点相同的路径简单路径路径中顶点不重复出现简单回路除首尾外其余顶点不重复的回路距离从u到v的最短路径的长度不存在则为∞若一个图有n个顶点且有大于n-1条边则此图一定有环。5. 子图若V ⊆ V且E ⊆ E则称G是G的子图。类型定义生成子图满足V(G) V(G)的子图并非V和E的任何子集都能构成子图——E中的边关联的顶点必须在V中。6. 连通性无向图术语定义连通从v到w存在路径连通图图中任意两个顶点都是连通的连通分量无向图中的极大连通子图若一个图有n个顶点边数少于n-1则此图必然是非连通的。7. 强连通性有向图术语定义强连通从v到w和从w到v都有路径强连通图图中任意一对顶点都是强连通的强连通分量有向图中的极大强连通子图有向图强连通的最少边数n条形成一个环8. 生成树与生成森林术语定义生成树连通图的极小连通子图包含所有顶点和n-1条边生成森林非连通图中每个连通分量的生成树共同构成区分极大连通子图连通分量要求包含尽可能多的顶点和边极小连通子图生成树要求保持连通且边数最少。9. 其他术语术语定义完全图无向|E| n(n-1)/2有向|E| n(n-1)稀疏图/稠密图|E| n log₂n视为稀疏图网边上带有权值的图有向树一个顶点的入度为0其余顶点的入度均为1的有向图二、图的存储及基本操作2.1 邻接矩阵法#define MaxVertexNum 100 typedef struct { VertexType vex[MaxVertexNum]; // 顶点表 EdgeType edge[MaxVertexNum][MaxVertexNum]; // 邻接矩阵边表 int vexnum, arcnum; // 当前顶点数和边数 } MGraph;特点图类型邻接矩阵特点无向图一定是对称矩阵第i行列非零元素个数 顶点i的度有向图第i行非零元素个数 出度第i列 入度重要结论空间复杂度O(n²)判断两点是否有边O(1)确定图中边数需遍历整个矩阵稠密图适合邻接矩阵Aⁿ[i][j] 从i到j长度为n的路径数量2.2 邻接表法#define MaxVertexNum 100 typedef struct ArcNode { // 边表结点 int adjvex; // 邻接点位置 struct ArcNode *nextarc; // 下一条边的指针 // InfoType info; // 网边权值 } ArcNode; typedef struct VNode { // 顶点表结点 VertexType data; // 顶点信息 ArcNode *firstarc; // 第一条边 } VNode, AdjList[MaxVertexNum]; typedef struct { AdjList vertices; // 邻接表 int vexnum, arcnum; // 顶点数和边数 } ALGraph;特点图类型空间复杂度特点无向图O(n 2|E|)每条边出现两次有向图O(n |E|)—稀疏图适合邻接表找所有邻接点邻接表高效邻接矩阵需扫描整行判断两点是否有边邻接表需遍历边表效率较低有向图入度需遍历所有顶点的边表邻接表的表示不唯一取决于输入顺序2.3 十字链表有向图每条弧用一个弧结点表示每个顶点用一个顶点结点表示。弧结点结构顶点结点结构优点容易找到以v为尾的弧出度和以v为头的弧入度2.4 邻接多重表无向图每条边只用一个结点表示解决了邻接表中一条边用两个结点表示的问题。边结点结构顶点结点结构优点判断边是否存在只需遍历一次2.5 四种存储方式对比存储方式空间复杂度找相邻边删除边/顶点适用场景表示唯一性邻接矩阵O(n²)遍历行/列O(n)删边方便删顶点需移动数据稠密图唯一邻接表无向O(n2|E|)有向O(n|E|)方便不方便稀疏图不唯一十字链表O(n|E|)方便方便有向图不唯一邻接多重表O(n|E|)方便方便无向图不唯一三、图的遍历3.1 广度优先搜索BFS类似于树的层序遍历借助队列实现按路径长度递增的顺序访问顶点。bool visited[MAX_VERTEX_NUM]; void BFSTraverse(Graph G) { for (int i 0; i G.vexnum; i) visited[i] FALSE; InitQueue(Q); for (int i 0; i G.vexnum; i) if (!visited[i]) BFS(G, i); } void BFS(ALGraph G, int i) { visit(i); visited[i] TRUE; EnQueue(Q, i); while (!QueueEmpty(Q)) { DeQueue(Q, v); for (ArcNode *p G.vertices[v].firstarc; p; p p-nextarc) { w p-adjvex; if (!visited[w]) { visit(w); visited[w] TRUE; EnQueue(Q, w); } } } }性能分析空间复杂度O(n)辅助队列时间复杂度邻接表O(n |E|)邻接矩阵O(n²)BFS求单源最短路径非带权图void BFS_MIN_Distance(Graph G, int u) { for (int i 0; i G.vexnum; i) d[i] ∞; visited[u] TRUE; d[u] 0; EnQueue(Q, u); while (!QueueEmpty(Q)) { DeQueue(Q, u); for (w FirstNeighbor(G, u); w 0; w NextNeighbor(G, u, w)) if (!visited[w]) { visited[w] TRUE; d[w] d[u] 1; EnQueue(Q, w); } } }广度优先生成树邻接矩阵存储生成树唯一邻接表存储生成树可能不唯一3.2 深度优先搜索DFS类似于树的先序遍历借助递归栈实现遵循“尽可能深”地探索的策略。bool visited[MAX_VERTEX_NUM]; void DFSTraverse(Graph G) { for (int i 0; i G.vexnum; i) visited[i] FALSE; for (int i 0; i G.vexnum; i) if (!visited[i]) DFS(G, i); } void DFS(ALGraph G, int i) { visit(i); visited[i] TRUE; for (ArcNode *p G.vertices[i].firstarc; p; p p-nextarc) { j p-adjvex; if (!visited[j]) DFS(G, j); } }性能分析空间复杂度O(n)递归工作栈时间复杂度邻接表O(n |E|)邻接矩阵O(n²)深度优先生成树/森林连通图一棵生成树非连通图生成森林3.3 图的遍历与连通性图类型遍历特点无向图调用BFS/DFS的次数 连通分量数有向图一次遍历不一定能访问所有顶点需外层循环确保全覆盖四、思考1. 邻接矩阵 ≈ 城市之间的直达航班表行是出发城市列是到达城市单元格填1表示有直达航班。对角线是自己的城市0矩阵对称表示往返都有航班。2. 邻接表 ≈ 微信好友列表每个用户有一个好友列表边表只存储自己的好友不存储非好友关系。空间利用率高。3. BFS ≈ 六度分隔理论你认识的朋友是第一层朋友的朋友是第二层……BFS正是按这个层层递进的顺序探索“社交网络”中的人际关系。4. DFS ≈ 走迷宫沿着一条路一直走走到死胡同就退回上一个岔路口换一条路继续走直到走遍所有路。注以上内容参考 2027年数据结构考研复习指导 王道论坛 组编其中有一些个人想法如有任何错误或不妥欢迎各位大佬指出如果各位有一些有意思的想法也可以和我交流一下~感谢五、明日计划图下— 最小生成树、最短路径、拓扑排序、关键路径

相关文章:

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

一、图的基本概念1.1 图的定义图G由顶点集V和边集E组成,记为G(V,E)要素说明V(G)顶点的有限非空集E(G)顶点之间关系的集合重要:线性表可以是空表,树可以是空树,但图不可以是空图。顶点集V必须非空,但边集E可以为空。1.2…...

告别Function模块!手把手教你用Simulink DLL为Cruise搭建更复杂的能量回收策略

告别Function模块:CruiseSimulink联合仿真实现高阶能量回收策略 当你在Cruise中构建的能量回收策略开始变得复杂,Function模块的局限性是否让你感到束手束脚?代码冗长、信号管理混乱、调试困难——这些问题在开发复杂控制策略时尤为突出。本文…...

避坑指南:RK3588数字麦克风阵列录音,如何解决多路PDM通道配置与tinycap多通道采集问题?

RK3588多路数字麦克风阵列配置实战:从硬件映射到tinycap多通道录音全解析 在智能语音设备开发中,多麦克风阵列的配置往往是音频处理的第一道门槛。当你的会议宝需要支持360度拾音,或是语音助手要实现噪声抑制和声源定位时,RK3588平…...

2026年想涨薪?这10个IT证书门槛低、含金量高,小白也能冲!

2026年高含金量IT证书推荐在数字化转型加速的背景下,IT证书成为职业发展的关键助力。以下10个证书门槛低、市场需求大,尤其适合希望2026年涨薪的从业者,其中CDA数据分析师证书因其实用性和行业认可度多次被提及。证书分类与对比证书名称适用领…...

架构图大全

...

手把手教你用uni-app的TabBar组件快速搭建一个仿微信/抖音的多端小程序

从零构建仿主流App的uni-app多端TabBar实战指南 每次打开微信或抖音,底部那排精致的导航栏总是默默承载着核心功能入口。作为移动端设计的经典范式,TabBar不仅是用户习惯的交互模式,更是产品架构的视觉映射。对于uni-app开发者而言&#xff0…...

别只盯着漏洞利用:从Amaterasu靶场学到的3个高效信息收集思维

从Amaterasu靶场实战中提炼的3个高阶信息收集思维 当大多数安全从业者还在机械地扫描端口和枚举服务时,真正的高手已经在思考如何将信息收集转化为系统性的侦察艺术。Amaterasu靶场就像一面镜子,照出了我们工作流中的思维盲区——那些被Nmap默认脚本掩盖…...

无畏契约启动闪退修复方法:Win10/Win11全场景解决教程

点击“开始”按钮,看到LOGO,然后瞬间回到桌面。这种启动闪退最让人摸不着头脑。别慌,启动阶段就崩溃,90%的问题都出在游戏环境检测环节,而不是游戏中途的负载问题。核心原因要么是反作弊系统(Vanguard&…...

PX4姿态解算技术详解(七):attitude_estimator_q 中的两个问题讨论

在前面的章节中,我们系统梳理了 attitude_estimator_q 的工作原理——从初始对准、重力校正、磁力计航向校正到统一的闭环更新。本章把注意力集中在两个值得深入讨论的问题上: 水平姿态估计与航向估计是否存在耦合;固定翼无人机协调转弯时&am…...

VLSI物理设计实战:从Global Placement到Detailed Placement,手把手教你理解芯片布局的核心算法

VLSI物理设计实战:从Global Placement到Detailed Placement的算法精要 芯片物理设计中的布局阶段决定了数亿晶体管在硅片上的精确位置,直接影响芯片性能、功耗和面积。本文将深入解析从全局布局到详细布局的核心算法,帮助工程师建立对EDA工具…...

用Python实现贪心算法解决多机调度问题:从理论到代码的保姆级教程

用Python实现贪心算法解决多机调度问题:从理论到代码的保姆级教程 在分布式计算和任务调度领域,如何高效分配有限资源以最小化总处理时间是一个经典难题。想象你手头有10个数据处理任务,需要分配到3台服务器上运行——每个任务耗时不同&#…...

[架构解析]《图灵完备》“迷宫”关卡的汇编指令与机器人寻路逻辑

1. 迷宫寻路的底层逻辑与架构设计 第一次接触《图灵完备》的迷宫关卡时,我被这个看似简单实则精妙的设计震撼到了。一个只有8位指令长度的计算机架构,却要完成复杂的迷宫寻路任务。这就像用一把瑞士军刀建造摩天大楼,既充满挑战又令人兴奋。 …...

从粉体到面板,氧化锆刮水片的品控逻辑

一块合格的氧化锆陶瓷刮水片,其可靠性并非仅靠材质本身决定,更多取决于从粉体处理到烧结加工的每一个生产环节。氧化锆原料的纯度、粒度分布、成型密度以及烧结曲线的控制,都会对最终产品的硬度、韧性和表面光洁度产生影响。若粉体中杂质含量…...

保姆级教程:在Abaqus/CAE中为单向复合材料手动与脚本定义局部坐标系(附横观各向同性参数计算)

复合材料仿真实战:Abaqus局部坐标系定义与横观各向同性参数解析 在复合材料有限元分析中,准确描述纤维取向是仿真的关键第一步。许多工程师在使用Abaqus时会遇到这样的困境:明明按照教程设置了材料参数,但仿真结果却与实验数据存在…...

5分钟学会B站视频永久保存:m4s-converter完整使用指南

5分钟学会B站视频永久保存:m4s-converter完整使用指南 【免费下载链接】m4s-converter 一个跨平台小工具,将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter 你是否曾遇到过B站收藏的视频突…...

SwiftUI学习笔记3-布局和样式

本课程将探索三种基本的堆栈,它们分别用于水平排列视图、垂直排列视图以及将视图分层堆叠。学习内容汇总:使用类型推断减少代码使用边框调试布局问题使用框架调整元素大小使用三种类型的堆栈—— VStack 、 HStack 和 ZStack ——创建复杂界面使用间距控…...

别再傻傻分不清了!一文搞懂UART、RS232、RS485和RS-422到底怎么选(附选型指南)

串口通信协议终极选型指南:UART、RS232、RS485与RS-422深度解析 在工业自动化、物联网设备开发或嵌入式系统设计中,工程师们经常面临一个基础却关键的选择:如何为设备间的数据通信选择合适的串口协议?UART、RS232、RS485和RS-422这…...

你的 Tree Shaking 可能是“假的”?

你以为你用了 ES Module,就自动开启 Tree Shaking 了? 很遗憾,大多数情况下——并没有真正生效。很多项目打包后: 明明没用的代码还在bundle 体积异常膨胀优化了半天效果不明显 问题很可能出在一个你没注意的地方: pac…...

Windows音频路由终极指南:如何用Audio Router实现多设备音频分发

Windows音频路由终极指南:如何用Audio Router实现多设备音频分发 【免费下载链接】audio-router Routes audio from programs to different audio devices. 项目地址: https://gitcode.com/gh_mirrors/au/audio-router 你是否厌倦了Windows系统中所有应用音频…...

终极文档下载解决方案:告别繁琐流程,轻松获取任何可见文档

终极文档下载解决方案:告别繁琐流程,轻松获取任何可见文档 【免费下载链接】kill-doc 看到经常有小伙伴们需要下载一些免费文档,但是相关网站浏览体验不好各种广告,各种登录验证,需要很多步骤才能下载文档,…...

论文AI率从50%降到10%!4个实用指令+3个技巧轻松过审

写完论文最闹心的是什么?重复率高已经够头疼,现在不少高校还加了AIGC检测,辛辛苦苦写的内容因为AI痕迹超标被打回,熬了好几个大夜改出来还是过不了,这种糟心的经历相信很多人都有过。 别着急!我前后花了一…...

AI工程化设计(五)Agent设计范式(2)Plan-and-Execute

Plan-and-Execute:比 ReAct 更“有全局观”的 Agent 设计范式一、介绍1. 什么是 Plan-and-ExecutePlan-and-Execute 是另一类非常重要的 Agent 设计范式,核心思想可以概括为一句话:先把任务想清楚、拆清楚,再按步骤执行。也就是把…...

iFakeLocation:跨平台iOS虚拟定位技术深度解析与实战应用

iFakeLocation:跨平台iOS虚拟定位技术深度解析与实战应用 【免费下载链接】iFakeLocation Simulate locations on iOS devices on Windows, Mac and Ubuntu. 项目地址: https://gitcode.com/gh_mirrors/if/iFakeLocation iFakeLocation是一款创新的跨平台iOS…...

Windows Cleaner:当C盘爆红时,你的Windows系统救星来了!

Windows Cleaner:当C盘爆红时,你的Windows系统救星来了! 【免费下载链接】WindowsCleaner Windows Cleaner——专治C盘爆红及各种不服! 项目地址: https://gitcode.com/gh_mirrors/wi/WindowsCleaner 还在为电脑越来越慢而…...

生产PVC喷墨白卡工厂推荐

在当今的商业社会中,PVC喷墨白卡的应用越来越广泛,无论是在广告宣传、身份识别还是产品标签等领域,都能看到它的身影。然而,市场上PVC喷墨白卡的质量参差不齐,选择一家靠谱的生产工厂至关重要。今天,就为大…...

Layerdivider:让每张图片都能像洋葱一样层层剥开的魔法工具

Layerdivider:让每张图片都能像洋葱一样层层剥开的魔法工具 【免费下载链接】layerdivider A tool to divide a single illustration into a layered structure. 项目地址: https://gitcode.com/gh_mirrors/la/layerdivider 想象一下,你有一张美丽…...

生产覆膜白卡公司推荐

在当今的商业社会中,各类卡片的使用场景愈发广泛,覆膜白卡作为其中一种重要的卡片类型,其质量和适用性备受关注。如果你正在寻找一家可靠的覆膜白卡生产公司,那么广州杰众智能科技有限公司绝对值得考虑。一、公司实力与信誉有保障…...

游戏分服总跨大区:如何用IP精准定位服务避免跨运营商分配?

一、一个常见但少被量化的痛点 某款MOBA游戏在大促期间收到大量玩家投诉:“匹配后延迟从20ms跳到120ms,角色卡顿”。排查发现,问题根源在于IP定位数据将部分南方电信用户错误判定为北方联通节点,导致跨运营商、跨大区分配。这种错…...

告别马赛克:实测用CodeFormer给AI生成的脸部图片‘补妆’与高清化

用CodeFormer为AI生成人脸打造电影级精修方案 当你在Stable Diffusion中生成了一张构图完美但面部细节模糊的肖像,或是在Midjourney里得到了五官轻微扭曲的虚拟角色时,那种"差一口气"的遗憾感,每个AI绘画玩家都深有体会。传统的高清…...

灾难恢复开发:高薪冷门赛道

在数字化浪潮席卷全球的今天,企业运营的神经中枢已全面接入信息系统。然而,数据中心的火灾、突发的网络攻击、自然灾害的侵袭,乃至一次人为的误操作,都可能让承载核心业务的系统瞬间瘫痪。对于大多数软件工程师而言,日…...