🕸️ 第五部分:图论算法

学会在题目中看见图并高效解决它。BFS、DFS、树、并查集和 Kruskal 最小生成树——USACO Silver 的核心。

📚 4 章 · ⏱️ 预计 2-3 周 · 🎯 目标:达到 USACO Silver 水平

第五部分:图论算法

预计用时:2-3 周

图在竞赛编程中无处不在:迷宫、网络、家族树、城市地图。第五部分教你看见题目中的图并高效解决它们。


涵盖的主题

章节主题核心思想
第 5.1 章图的基础表示图;邻接表;图的类型
第 5.2 章BFS 与 DFS遍历、最短路径、洪水填充、连通分量、10 种变种
第 5.3 章最短路径Dijkstra、Bellman-Ford、Floyd-Warshall、SPFA、Johnson
第 5.4 章二叉树与树算法BST、遍历、LCA(朴素+倍增)、欧拉序、树的直径
第 5.5 章并查集路径压缩+按秩合并、Kruskal MST、带权并查集、种类并查集
第 5.6 章线段树区间查询/更新、懒惰传播、动态开点
第 5.7 章树状数组(BIT)前缀和、区间查询、权值BIT

学完本部分后能解决什么问题

完成第五部分后,你将能够挑战:

  • USACO Bronze:

    • 洪水填充(统计网格中连通区域数量)
    • 可达性问题(奶牛 A 能到达奶牛 B 吗?)
    • 网格/图中的简单 BFS 最短路径
  • USACO Silver:

    • 隐式图上的 BFS/DFS(状态节点而非显式节点)
    • 多源 BFS(到最近障碍物/火焰的距离)
    • 动态连通性的并查集
    • 边添加下的图连通性
    • 树的问题(子树求和、深度、LCA)

引入的关键算法

技术章节时间复杂度USACO 相关度
DFS(递归和迭代)5.2O(V + E)连通性、环检测
BFS5.2O(V + E)最短路径(无权)
网格 BFS5.2O(R × C)迷宫问题、洪水填充
多源 BFS5.2O(V + E)到最近源点的距离
连通分量5.2O(V + E)统计不连通区域数量
树的遍历(前序/后序)5.3O(N)子树聚合
并查集(DSU)5.3O(α(N)) ≈ O(1)动态连通性
Kruskal 最小生成树5.3O(E log E)最小生成树
Dijkstra 算法5.4O((V + E) log V)非负权图的单源最短路
Bellman-Ford5.4O(V × E)含负边的单源最短路;负环检测
Floyd-Warshall5.4O(V³)小图的全对最短路
SPFA5.4O(V × E) 最坏有队列优化的实用 Bellman-Ford

前置条件

开始第五部分前,请确认你能做到:

  • 使用 vector<vector<int>> 存储邻接表(第 2.3–3.1 章)
  • 使用 STL 中的 queuestack(第 3.1、3.5 章)
  • 处理二维数组和网格遍历(第 2.3 章)
  • 理解基本的嵌套循环(第 2.2 章)
  • 使用 priority_queue(第 3.1 章)——第 5.3 章(Dijkstra)需要

本部分学习建议

  1. 第 5.1 章主要是准备工作——阅读以了解图的表示,但真正的算法从第 5.2 章开始。
  2. 第 5.2 章(BFS) 是 USACO Silver 最重要的章节之一。约 1/3 的 Silver 题目涉及网格 BFS。
  3. BFS 中 dist[v] == -1 表示未访问的模式是关键。永远不要在弹出时标记访问——要在压入时标记。
  4. 第 5.5 章的并查集对连通性问题比 BFS 更快编码。记住那个 15 行的模板——你会经常用到它。
  5. 第 5.3 章(Dijkstra) 对加权最短路径问题至关重要。用带 priority_queue<pair<int,int>> 的标准模板——这是 Silver/Gold 最常见的图算法。

💡 核心思路: 大多数 USACO 图论题实际上是伪装成网格题。网格单元 (r,c) 变成图节点;相邻单元变成边。对这个隐式图做 BFS 就能找到最短路径。

🏆 USACO 技巧: 每当在题目中看到「最短路径」「最少步数」或「最少移动次数」,立刻想到 BFS。每当看到「这两个连通吗?」或「有多少组?」,想到 DSU。