本章要回答的三个问题:树只许有双亲,图放开了所有关系——任意节点可与任意节点相连,结构自由了,麻烦也从哪来?怎么在可能绕圈的网络上系统地走遍每个节点?又怎么在带权、带方向、带依赖的网络里回答"最省、最便宜、次序"这三类问题?
现实世界的关系网几乎全是图:城市间的道路、社交关注、网页超链接、课程先修依赖、任务流水线。图比树多出三样"危险品"——环(走着走着回到原地)、方向(有去无回)、权重(边有代价)。第三章的遍历心法在图上直接失灵:没有 visited 记录,一个三角形就能让递归永远打转。
本章的功课因此按"驯服三样危险品"展开:先解决"怎么表示与走遍"(表示法与 BFS、DFS),再解决"带权网络里离谁最近"(最短路径三式),然后是"连通全网的最便宜骨架"(最小生成树),最后是"方向即依赖时的合法次序"(拓扑排序与强连通分量)。一章下来,图论入门的四梁八柱全部立起。
学图论最容易陷进"算法博物馆":每个算法都见过、都背过,真拿到一张具体的图却不敢下笔。本章的对策是全程手工演算——Dijkstra 的每轮松弛、Kruskal 的每条选边,都要在纸上走完一遍,走完你才会发现这些算法不过是第二章队列、第三章堆的老朋友换了个战场。
对照开头的问题,本章的知识点清单如下:
| 节 | 回答哪个问题 | 关键产出 |
|---|---|---|
| 4.1 图的表示 | 图装进内存有几种装法 | 矩阵与表的双重实现、选型表 |
| 4.2 图的遍历 | 有环怎么走遍 | BFS 与 DFS 实现、最短步数、连通分量 |
| 4.3 最短路径 | 带权网络离谁最近 | Dijkstra 松弛表、Bellman-Ford、Floyd 对比 |
| 4.4 最小生成树 | 连通全网最省的骨架 | Prim 与 Kruskal 双解、并查集预告 |
| 4.5 拓扑与强连通 | 依赖关系怎么排出合法次序 | Kahn 算法、环检测、强连通分量直觉 |
本章出口直接接通三条主线:Kruskal 判环需要的并查集在第七章 7.1 正式修炼;图遍历的骨架(DFS 加剪枝)是第六章回溯法的地基;最短路思想(逐步定型、松弛更新)在第六章动态规划里以"状态转移"的面目重现。工程上,地图导航、任务编排、依赖解析(包管理器)、社交推荐,都在这一章的射程内。