图论在软考里出现的位置比很多人以为的要散:数据结构与算法、程序设计语言、甚至系统架构设计里的网络流与路径规划,都可能绕回最短路径、拓扑排序和连通性判断。真到做题或写代码时卡住的,往往不是「图是什么」这个定义,而是给你一个带权有向图,让你说清楚 Dijkstra 为什么不能处理负权边、Floyd 的三重循环为什么把中间点写在外层、拓扑排序的入度数组到底在维护什么。这门课针对的就是这类具体缺口。
先说清楚哪些人该看、哪些人可以跳过
如果你已经能默写邻接表和邻接矩阵的互转、能独立写出并查集并解释路径压缩与按秩合并的区别、看到「无向图判环」能立刻想到并查集或 DFS,那这门课的前几部分对你偏简单,可以直接挑后面的最短路、最小生成树和网络流部分查漏补缺。
更适合的读者是这几类:一是刷软考真题时图论选择题靠排除法蒙对、心里没底;二是转岗做 Java 后端,面到「手写一个拓扑排序」或「判断二分图」时只能背模板;三是平时 CRUD 写得多,一遇到依赖解析、任务调度、关系网络这类问题就不知道从哪下手。这门课用 Java 讲,对已经会写 Java 但算法生疏的人友好,不需要额外补语言基础。
内容大致覆盖到哪里
- 图的表示与基础遍历:邻接表、邻接矩阵的取舍,DFS 与 BFS 的递归/非递归写法,以及它们各自适合解决什么问题。
- 连通性问题:无向图连通分量、有向图强连通分量,并查集的应用场景与实现细节。
- 路径问题:单源最短路的 Dijkstra、Bellman-Ford,多源最短路的 Floyd,以及负权边这个高频坑点。
- 生成树与拓扑:最小生成树的 Prim 和 Kruskal,有向无环图的拓扑排序及其在依赖关系里的用途。
- 进阶方向:二分图判定、网络流的基本建模思路,为更难的题打底。
它不会把每个算法都推到竞赛级优化,重点是把「为什么这么写」讲清楚,让你在考场上或面试里能自己推导,而不是背一段记不住的代码。
配套练习怎么用
图论最忌讳只看不写。建议每学完一个算法,先关掉讲解自己从零实现一遍,用同一组测试数据对比结果;再换一组边界数据,比如只有一个顶点、全是孤立点、带负权边的图,看你的代码会不会崩。课程里的示例代码可以当参照,但别直接抄。
刷题时优先做「判断型」题目而不是「模板型」题目:给你一个场景,问该用 BFS 还是并查集、该用哪种最短路,这种题最能暴露理解漏洞。做完后回过头问自己一句:如果图的规模翻十倍,我的做法还成立吗?
学完应该能回答这几个问题
- Dijkstra 为什么要求边权非负?如果出现负权边,应该换成什么思路?
- Floyd 的三重循环,为什么把中间点 k 放在最外层?
- 拓扑排序的入度法在什么情况下会失败,失败说明图有什么性质?
- 并查集和 DFS 都能判连通,什么场景下前者更合适?
- Prim 和 Kruskal 分别适合稠密图还是稀疏图,为什么?
如果这些问题你能不看笔记说清楚,这门图论部分就算过关了。要是还有含糊的,正好用它当查漏补缺的清单。
学习建议
不用一口气刷完,图论知识点之间耦合不深,按「遍历 → 连通性 → 最短路 → 生成树与拓扑」的顺序推进即可。每两三个算法做一次小结,把易错点单独记一页。真正拉开差距的不是记住多少算法,而是拿到一个新问题时,能判断它属于图论里哪一类。
image.webp 下载附件 保存到相册 2025-6-21 15:03 上传
课程推荐
《玩转算法系列--图论精讲 (Java版)》image.webp 下载附件 保存到相册 2025-6-21 15:03 上传【技能收获】学完可掌握:Java 后端开发、Vue / 前端工程化。课程以实战为导向,覆盖从基础概念到完整项目落地的关键步骤,配套章节笔记便于课后复盘与面试前快速回顾。【学习建议】建议按目录顺序学习,先打基础再进入综合实战章节;每完成 2~3 节可结合笔记整理一份学习小结,最终尝试独立复现一套完整 Demo 写入个人作品集。【就业发展】可面向岗位:Linux 运维工程师、SRE、云计算工程师、DevOps 工程师。云原生与自动化运维仍是企业 IT 刚需方向,认证 + 实战项目组合能显著提升面试通过率,适合向中高级运维或架构岗进阶。 若你已有一定编程或运维基础,本课程可帮助你在现有技能栈上快速叠加热门方向能力,提升求职时的项目说服力与薪资谈判空间。
视频目录(123 节)
* 1-1 欢迎大家来到《玩转图论算法》 (1952).mp4
* 1-2 图论到底有什么用? (1957).mp4
* 1-3 课程编程环境的搭建 (1224).mp4
* 2-1 图的分类 (1344).mp4
* 2-2 图的基本概念 (2009).mp4
* 2-3 图的基本表示:邻接矩阵 (2006).mp4
* 2-4 更多图的方法 (1402).mp4
* 2-5 图的基本表示:邻接表 (1936).mp4
* 2-6 邻接表的实现 (1736).mp4
* 2-7 邻接表的问题和改进 (1509).mp4
* 2-8 实现邻接表的改进 (1732).mp4
* 2-9 图的基本表示的比较 (1413).mp4
* 3-1 数据结构遍历的意义 (1309).mp4
* 3-2 从树的深度优先遍历,到图的深度优先遍历 (1305).mp4
* 3-3 DFS逻辑的微观解读 (2021).mp4
* 3-4 实现图的深度优先遍历 (1448).mp4
* 3-5 图的深度优先遍历的改进 (1606).mp4
* 3-6 更多关于图的深度优先遍历 (1018).mp4
* 4-1 图的连通分量的个数 (0943).mp4
* 4-2 DFS中的一个技巧 (1432).mp4
* 4-3 求解联通分量 (1036).mp4
* 4-4 单源路径问题 (1001).mp4
* 4-5 单源路径问题的编程实现 (2134).mp4
* 4-8 提前结束递归:路径问题的另一个优化 (1906).mp4
* 4-9 无向图的环检测 (1631).mp4
* 4-10 二分图检测 (1102).mp4
* 4-11 实现二分图检测 (1215).mp4
* 4-12 本章小结和更多拓展 (1512).mp4
* 5-1 从树的广度优先遍历,到图的广度优先遍历 (1407).mp4
* 5-2 图的 BFS 的实现 (1321).mp4
* 5-3 使用 BFS 求解路径问题 (2023).mp4
* 5-8 BFS 的重要性质 (1629).mp4
* 5-9 无权图的最短路径 (1433).mp4
* 5-10 BFS 和 DFS 的神奇联系,与本章小结 (1344).mp4
* 6-1 算法笔试面试中的图论问题书写 (1826).mp4
* 6-2 图的建模和二维网格中的小技巧 (2021).mp4
* 6-3 编程实现图的建模 (2006).mp4
* 6-4 floodfill 算法 (1547).mp4
* 6-5 更多 floodfill 的问题 (1617).mp4
* 7-1 算法笔试面试中的 BFS 问题 (2115).mp4
* 7-2 图论建模的核心:状态表达 (1542).mp4
* 7-3 实现转盘锁问题 (2441).mp4
* 7-4 一道智力题 (1914).mp4
* 7-5 代码实现一道智力题 (2252).mp4
* 7-6 Leetcode 上一个困难的问题 (1707).mp4
* 7-7 实现滑动谜题 (1313).mp4
* 7-8 图论搜索和人工智能 (1816).mp4
* 8-1 什么是桥 (1130).mp4
* 8-2 寻找桥的算法思路 (1433).mp4
* 8-3 模拟寻找桥算法 (1743).mp4
* 8-4 实现寻找桥算法 (2134).mp4
* 8-5 图的遍历树 (1512).mp4
* 8-6 寻找割点的算法思路 (1400).mp4
* 8-7 实现寻找割点算法 (1533).mp4
* 8-8 本章小结:关于变量语义,和如何书写正确的算法 (1004).mp4
* 9-1 哈密尔顿回路和 TSP (1653).mp4
* 9-2 求解哈密尔顿回路的算法 (1452).mp4
* 9-3 实现哈密尔顿回路的算法 (2039).mp4
* 9-4 哈密尔顿回路算法的一个优化 (1227).mp4
* 9-6 Leetcode 上的哈密尔顿问题 (1833).mp4
* 9-7 状态压缩 (2148).mp4
* 9-8 基于状态压缩的哈密尔顿算法 (1402).mp4
* 9-9 记忆化搜索 (1844).mp4
* 9-10 哈密尔顿回路和哈密尔顿路径小结 (0510).mp4
* 10-1 什么是欧拉回路 (1345).mp4
* 10-2 欧拉回路的存在性及证明 (1935).mp4
* 10-3 实现欧拉回路存在性的判断 (0937).mp4
* 10-4 求解欧拉回路的三种算法 (1713).mp4
* 10-5 Hierholzer 算法模拟 (1351).mp4
* 10-6 实现 Hierholzer 算法 (2126).mp4
* 10-7 欧拉路径和本章小结 (0748).mp4
* 11-1 带权图及实现 (1832).mp4
* 11-2 Map 的遍历 (0950).mp4
* 11-3 最小生成树和 Kruskal 算法; (1200).mp4
* 11-4 切分定理 (1355).mp4
* 11-5 Kruskal 算法的实现 (1610).mp4
* 11-6 并查集动态环检测 (1603).mp4
* 11-7 Prim 算法的原理及模拟 (0905).mp4
* 11-8 实现 Prim 算法 (1322).mp4
* 11-9 Prim 算法的优化 (1815).mp4
* 11-10 本章小结和更多关于最小生成树问题的讨论 (1052).mp4
* 12-1 有权图的最短路径问题 (1128).mp4
* 12-2 Dijkstra 算法的原理和模拟 (1829).mp4
* 12-3 实现 Dijkstra 算法 (1919).mp4
* 12-4 Dijkstra 算法的优化 (1829).mp4
* 12-5 更多关于 Dijkstra 算法的讨论 (1603).mp4
* 12-6 Bellman-Ford 算法 (1441).mp4
* 12-7 负权环 (2133).mp4
* 12-8 实现 Bellman-Ford 算法. (1722).mp4
* 12-9 更多关于 Bellman-Ford 算法的讨论 (1413).mp4
* 12-10 Floyd 算法 (2105).mp4
* 12-11 实现 Floyd 算法 (1501).mp4
* 12-12 本章小结和更多关于最短路径问题的讨论 (1258).mp4
* 13-1 有向图的实现 (2055).mp4
* 13-2 有向图算法 (2018).mp4
* 13-3 有向图环检测和 DAG (1903).mp4
* 13-4 有向图的度入度和出度 (1237).mp4
* 13-5 有向图求解欧拉回路 (1900).mp4
* 13-6 拓扑排序 (1706).mp4
* 13-7 拓扑排序算法的实现 (1254).mp4
* 13-8 另一个拓扑排序算法 (1125).mp4
* 13-9 另一个拓扑排序算法的实现 (0840).mp4
* 13-10 有向图的强连通分量 (2037).mp4
* 13-11 Kosaraju 算法 (1939).mp4
* 13-12 Kosaraju 算法的实现 (2309).mp4
* 13-13 有向图算法小节 (1025).mp4
* 14-1 网络流模型和最大流问题 (1543).mp4
* 14-2 Ford-Fulkerson 思想 (2108).mp4
* 14-3 Edmonds-Karp 算法 (1526).mp4
* 14-4 最大流算法的基本架构 (1915).mp4
* 14-5 实现 Edmonds-Karp 算法 (1945).mp4
* 14-6 Edmonds-Karp 算法的测试和更多讨论 (1254).mp4
* 14-7 网络流问题建模 (1945).mp4
* 14-8 本章小结和更多相关讨论 (0810).mp4
* 15-1 最大匹配和完美匹配 (0836).mp4
* 15-2 使用最大流算法解决匹配问题 (0851).mp4
* 15-3 实现二分图匹配算法 (2035).mp4
* 15-4 通过 Leetcode 的一个 Hard 问题,看匹配算法建模 (2418).mp4
* 15-5 匈牙利算法 (2437).mp4
* 15-6 匈牙利算法的实现 (2546).mp4
* 15-7 基于递归实现的匈牙利算法 (1738).mp4
* 15-8 匹配问题小结 (0541).mp4
* 16-1 更广阔的图论算法世界 (2358).mp4
课程目录
第1章 和bobo老师一起,玩转图论算法 第2章 图的基本表示 第3章 图的深度优先遍历 第4章 图的深度优先遍历的应用 第5章 图的广度优先遍历 第6章 图论问题建模和 floodfill 第7章 图论搜索和人工智能 第8章 桥和割点,以及图的遍历树 第9章 哈密尔顿问题和状态压缩 第10章 欧拉回路和欧拉路径 第11章 最小生成树 第12章 最短路径算法 第13章 有向图算法 第14章 网络流 第15章 匹配问题 第16章 更广阔的图论世界






