PYTHON KNOWLEDGE · 15
树、图、DFS、BFS 与最短路
从节点与边的模型出发,掌握遍历、连通性、树结构、最小生成树和最短路径的适用条件。
GESP 6 级GESP 7 级GESP 8 级
01 · FORMAL DEFINITION
正式定义
图由顶点和边构成;树是连通且无环的无向图。DFS 沿路径深入后回溯,BFS 按距离层次扩展。算法的正确选择取决于图是否有向、边权是否为负、是否稠密以及目标是遍历、连通还是最短路。
02 · MUST KNOW
学完这一章,必须说清楚的规则
- 01
邻接矩阵占 O(V²) 空间,适合稠密图和快速查边;邻接表占 O(V+E),适合稀疏图。
- 02
DFS 常用递归或显式栈,BFS 使用队列;一般图都必须记录 visited 防止重复和死循环。
- 03
无权图的 BFS 首次到达即得到最少边数距离,可用 parent 还原路径。
- 04
树有 V-1 条边且任意两点路径唯一;二叉树前/中/后序描述根的访问时机。
- 05
Dijkstra 只适用于非负边权;Floyd 求所有点对最短路并允许负边,但不能有可达负环。
- 06
Kruskal 按边权排序并用并查集避环,得到连通无向带权图的最小生成树。
03 · RUNNABLE EXAMPLE
可运行示例与因果解释
from collections import deque
graph = [[1, 2], [0, 3], [0, 3], [1, 2]]
dist = [-1] * len(graph)
dist[0] = 0
queue = deque([0])
while queue:
u = queue.popleft()
for v in graph[u]:
if dist[v] == -1:
dist[v] = dist[u] + 1
queue.append(v)
print(dist)COMMON PITFALLS
常见误区
- 遍历一般图时不记录 visited
- 对负权边使用 Dijkstra
- 混淆最短路径树与最小生成树
- 递归 DFS 忽略深度限制
SCOPE & BOUNDARIES
适用边界
- 有向无环图、拓扑排序、强连通分量和负权最短路是图论后续主题。
- 网格搜索也是图搜索:格子是顶点,可移动关系是边;不要只背二维数组模板。