图算法
一句话说明
图算法本质上是在一堆“点和关系”里回答四类问题:能不能到、最短多远、怎样最低成本连起来、依赖顺序怎么排。
先判断题目属于哪一类
flowchart TD A["看到点、边、路径、依赖、联通"] --> B{"题目在问什么?"} B -- "能否到达 / 连通块 / 所有路径" --> C["遍历:DFS / BFS"] B -- "最少步数 / 最短距离" --> D["最短路"] B -- "最小成本把所有点连起来" --> E["最小生成树"] B -- "先做谁后做谁 / 是否有环" --> F["拓扑排序"] B -- "图里有哪些强结构" --> G["强连通分量 / 二分图 / 桥和割点"]
最常见选择题
刷题时先看这张分流表
| 题目特征 | 优先算法 | 为什么 |
|---|---|---|
| 无权图、每条边代价一样、问最少步数 | [[图的遍历/DFS与BFS | BFS]] |
边权只有 0/1 | [[高级专题/0-1 BFS | 0-1 BFS]] |
| 边权非负 | [[最短路径/单源最短路径 | Dijkstra]] |
| 允许负权边 | [[最短路径/单源最短路径 | Bellman-Ford]] |
| 要求所有点对最短路 | [[最短路径/多源最短路径 | Floyd-Warshall]] |
| 问依赖顺序、课程安排、是否有环 | [[最小生成树与拓扑排序/拓扑排序 | 拓扑排序]] |
| 问“用最小代价连接所有点” | [[最小生成树与拓扑排序/最小生成树 | 最小生成树]] |
| 问无向图连通块、枚举路径、回溯搜索 | [[图的遍历/DFS与BFS | DFS]] |
图算法知识地图
flowchart LR A["图算法"] --> B["图的基础"] A --> C["遍历"] A --> D["最短路径"] A --> E["生成树 / DAG"] A --> F["连通性"] A --> G["高级专题"] B --> B1["表示方式"] C --> C1["DFS"] C --> C2["BFS"] D --> D1["单源最短路"] D --> D2["多源最短路"] E --> E1["MST"] E --> E2["拓扑排序"] F --> F1["SCC / 桥 / 割点 / 二分图"] G --> G1["0-1 BFS / 欧拉路 / 网络流"]
📚 目录结构
1. 图的基础
- 图的表示:邻接矩阵、邻接表、边集数组怎么选
2. 图的遍历
- DFS与BFS:什么时候该“走到底”,什么时候该“按层推”
3. 最短路径
4. 最小生成树与拓扑排序
5. 连通性问题
6. 高级专题
🧠 看到题目时怎么快速识别
| 题面信号词 | 大概率方向 |
|---|---|
| 最少步数、最少操作次数、最短跳跃次数 | BFS |
| 最小距离、最小花费、最早到达、网络延迟 | 最短路 |
| 课程安排、依赖、先修关系、任务调度 | 拓扑排序 |
| 最低成本连接所有城市 / 所有点 | 最小生成树 |
| 联通块数量、省份数量、岛屿数量 | DFS / BFS / 并查集 |
| 每条边都要走一次 | 欧拉路径 |
| 两种颜色分组、冲突关系 | 二分图 |
📊 常用算法复杂度
| 类别 | 算法 | 时间复杂度 | 空间复杂度 | 备注 |
|---|---|---|---|---|
| 遍历 | DFS / BFS | O(V + E) | O(V) | 每个点边最多进处理流程一次 |
| 单源最短路 | Dijkstra | O((V + E)\log V) | O(V) | 适合非负权图 |
| 单源最短路 | Bellman-Ford | O(VE) | O(V) | 能处理负权边 |
| 全源最短路 | Floyd-Warshall | O(V^3) | O(V^2) | 点不大时可用 |
| 生成树 | Kruskal | O(E\log E) | O(V) | 常配合并查集 |
| 生成树 | Prim | O((V + E)\log V) | O(V + E) | 稠密图也常见 |
| DAG | Kahn / DFS 拓扑 | O(V + E) | O(V) | DAG 线性排序 |
| 连通性 | Tarjan | O(V + E) | O(V) | SCC / 桥 / 割点 |
🎯 建议学习顺序
- 先学 图的表示,理解邻接表和边集数组。
- 再学 DFS 与 BFS,这是所有图题的底盘。
- 接着学 单源最短路径,把 BFS、Dijkstra、Bellman-Ford 的边界分清。
- 然后学 最小生成树 和 拓扑排序。
- 最后补 强连通分量、二分图、网络流 等专题。
🎯 LeetCode 起步清单
| 类型 | 题目 | 核心算法 |
|---|---|---|
| 图遍历 | 200. 岛屿数量 | DFS / BFS |
| 图遍历 | 797. 所有可能的路径 | DFS 回溯 |
| 无权最短路 | 1091. 二进制矩阵中的最短路径 | BFS |
| 非负权最短路 | 743. 网络延迟时间 | Dijkstra |
| 负权 / 有限制松弛 | 787. K 站中转内最便宜的航班 | Bellman-Ford 变形 |
| 最小生成树 | 1584. 连接所有点的最小费用 | Kruskal / Prim |
| 拓扑排序 | 207. 课程表 | Kahn |
| 二分图 | 785. 判断二分图 | BFS / DFS 染色 |
相关主题
返回:算法学习导航