📘 教案 06:图算法(Graph Algorithms)
1. 问题定义
图用于描述:
"对象之间的关系"
形式化定义
一个图 (G = (V, E)):
- (V):顶点集合(nodes)
- (E):边集合(edges)
示例
- 社交网络(人之间的关系)
- 地图(城市之间的路径)
- 推荐系统(用户-物品关系)
2. 核心术语
2.1 有向图 vs 无向图
无向图
(u,v)=(v,u)\]\[ (u, v) = (v, u) \]\[(u,v)=(v,u)
👉 双向关系
有向图
u→v\]\[ u \\to v \]\[u→v
👉 单向关系
2.2 权重(Weight)
边可以带权:
(u,v,w)\]\[ (u, v, w) \]\[(u,v,w)
👉 表示距离 / 成本 / 时间
2.3 路径(Path)
节点序列:
A→B→C\]\[ A \\to B \\to C \]\[A→B→C
2.4 图的表示(必须讲)
邻接矩阵(Adjacency Matrix)
n×n\]\[ n \\times n \]\[n×n
优点:
- 查询快
缺点:
- 空间大
邻接表(Adjacency List)
text
A: B, C
B: D
优点:
- 节省空间
- 实用性强
3. 图的遍历(基础)
3.1 深度优先搜索(DFS)
思想:
一条路走到底,再回溯
代码结构
text
DFS(node):
标记 node
for 邻居:
if 未访问:
DFS(邻居)
3.2 广度优先搜索(BFS)
思想:
一层一层扩展
数据结构:
👉 队列(Queue)
代码
text
BFS(start):
queue.push(start)
while queue 非空:
node = pop()
访问 node
for 邻居:
入队
3.3 DFS vs BFS
| 项目 | DFS | BFS |
|---|---|---|
| 数据结构 | 栈 | 队列 |
| 特点 | 深 | 广 |
| 用途 | 搜索路径 | 最短路径(无权) |
4. 最短路径问题(核心)
问题:
从一个点到其他点的最短路径
5. Dijkstra 算法(重点)
5.1 适用条件
👉 边权非负
5.2 核心思想(贪心)
每次选择当前"距离最小"的节点
5.3 状态定义
dist\[i\]=起点到 i 的最短距离\]\[ dist\[i\] = \\text{起点到 i 的最短距离} \]\[dist\[i\]=起点到 i 的最短距离
5.4 算法流程
text
初始化 dist
while 存在未访问节点:
选 dist 最小节点 u
标记 u
for 邻居 v:
更新 dist[v]
5.5 转移公式
dist\[v\]=min(dist\[v\],dist\[u\]+w(u,v))\]\[ dist\[v\] = \\min(dist\[v\], dist\[u\] + w(u,v)) \]\[dist\[v\]=min(dist\[v\],dist\[u\]+w(u,v))
5.6 时间复杂度
- 普通:(O(n^2))
- 堆优化:(O((V+E)\log V))
6. 最小生成树(MST)
问题:
连接所有节点,边权和最小
6.1 Kruskal 算法(贪心)
思想:
按边权从小到大选边,不形成环
数据结构:
👉 并查集(Union-Find)
6.2 Prim 算法
思想:
从一个点开始,不断扩展最小边
7. 图算法的本质总结
7.1 DFS / BFS
👉 搜索结构
7.2 Dijkstra
👉 最短路径(贪心)
7.3 MST
👉 最优连接(贪心)
8. 常见错误
❌ 错误1:图表示选错
👉 实际一般用邻接表
❌ 错误2:BFS不会用队列
❌ 错误3:Dijkstra用于负权图
👉 错误!
9. 关键结论
- 图 = 关系建模
- BFS/DFS = 基础遍历
- Dijkstra = 最短路径
- MST = 最小连接
10. 最小教学总结
图算法的本质是:
在"关系网络"中寻找结构或最优路径