DAY 03
最短路与欧拉路
CSP 暑期集训 · Shortest Path & Euler Path
Dijkstra
单源最短路(贪心+优先队列)
Floyd-Warshall
全源最短路(DP三重循环)
Bellman-Ford / SPFA
负权边最短路·队列优化
欧拉路/回路
一笔画问题·Hierholzer算法
| 对比项 | 朴素Dijkstra | 优先队列优化 |
|---|---|---|
| 找最小dist | 遍历所有节点 O(n) | 堆顶 O(1) |
| 松弛后更新 | 直接改数组 O(1) | 插入堆中 O(log n) |
| 总找最小次数 | n次 × O(n) = O(n²) | n次 × O(1) = O(n) |
| 总松弛更新次数 | O(1) × m = O(m) | O(log n) × m = O(m log n) |
| 总复杂度 | O(n² + m) = O(n²) | O((n+m) log n) |
| 适用场景 | 稠密图(m ≈ n²) | 稀疏图(m ≈ n) |
greater<pii> 实现小根堆(默认是大根堆);
③ 懒删除避免修改堆中旧值,空间换时间;
④ 0x3f3f3f3f ≈ 109,两个相加不会溢出 int(最大 2×109 < 2.1×109)
| 算法 | 适用 | 复杂度 | 负权边 | 核心思想 | 优缺点 |
|---|---|---|---|---|---|
| Dijkstra(堆优化) | 单源 | O((n+m)log n) | ❌ | 贪心+优先队列 | 最快/不能负权 |
| Bellman-Ford | 单源 | O(nm) | ✅ | 松弛n-1轮 | 万能/太慢 |
| SPFA | 单源 | 平均O(m) 最坏O(nm) | ✅ | 队列优化BF | 快/可能被卡 |
| Floyd | 全源 | O(n³) | ✅ | DP枚举中转点 | 代码短/n≤300 |
| 对比项 | Floyd | n次Dijkstra |
|---|---|---|
| 时间复杂度 | O(n³) | O(n(n+m)log n) |
| 空间复杂度 | O(n²) | O(n+m) |
| 实现难度 | ⭐ 3行核心代码 | ⭐⭐⭐ 需邻接表+堆 |
| 支持负权边 | ✅ 可以(无负环时) | ❌ 不可以 |
| 适用场景 | n ≤ 300,稠密图 | n,m 较大,稀疏图 |
| 代码量 | 极少 | 较多 |
min(dist[u][v], w)| 编号 | 题目 | 知识点 | 难度 |
|---|---|---|---|
| 1 | P4779 【模板】单源最短路径(标准版) | Dijkstra 堆优化模板 | 普及 |
| 2 | P3371 【模板】单源最短路径(弱化版) | Dijkstra 朴素版也能过 | 普及 |
| 3 | P1339 [USACO09OCT] Heat Wave G | 单源最短路基础 | 普及+/提高− |
| 4 | P1629 邮递员送信 | 正反向图各跑 Dijkstra | 普及+/提高− |
| 5 | P3385 【模板】负环 | SPFA 判负环 | 普及+/提高− |
| 6 | P1938 [USACO09NOV] Job Hunt S | SPFA 负权边最短路 | 普及 |
| 7 | P1119 灾后重建 | Floyd 按时间逐步加入中转点 | 普及+/提高− |
| 8 | P1613 跑路 | Floyd + 倍增预处理 | 普及+/提高− |
| 9 | P2966 [USACO09DEC] Cow Toll Paths G | Floyd 变形 + 点权 | 提高 |
| 10 | P7771 【模板】欧拉路径 | Hierholzer 模板 | 普及+/提高− |
| 11 | P1341 无序字母对 | 欧拉路径 + 字典序最小 | 普及+/提高− |
| 12 | UVA10129 Play on Words | 单词首尾建图判欧拉路径 | 普及+/提高− |
| 算法 | 适用 | 复杂度 | 负权边 | 核心思想 |
|---|---|---|---|---|
| Dijkstra(堆优化) | 单源 | O((n+m)log n) | ❌ | 贪心选最小+优先队列 |
| Dijkstra(朴素) | 单源 | O(n²) | ❌ | 贪心选最小+遍历 |
| Bellman-Ford | 单源 | O(nm) | ✅ | 松弛n-1轮 |
| SPFA | 单源 | 平均O(m) 最坏O(nm) | ✅ | 队列优化Bellman-Ford |
| Floyd | 全源 | O(n³) | ✅ | DP枚举中转点 |
| n×Dijkstra | 全源 | O(n(n+m)log n) | ❌ | 跑n次Dijkstra |