跳到主要内容
约 3 分钟3 张卡

图

图用顶点与边表示连接、依赖和状态转换。本文负责图的表示、复杂度、连通性与权重选择。

1. 面试核心​

先记住这几条,再读正文
  • 存储方式。 邻接表空间为 O(V+E),适合稀疏图;邻接矩阵空间为 O(V²),但可以在 O(1) 时间判断一条边是否存在。卡 · 顶点、方向与权重
  • 无向连通性。 无向图按相互可达关系划分连通分量。一次完整搜索可找出起点所在分量,再从未访问节点继续即可遍历所有分量。
  • 有向连通性。 有向图的强连通要求双向可达,单向搜索只给出可达集合。卡 · 连通分量与可达性
  • 最短路条件。 非负权图可用 Dijkstra,普通 BFS 适用于等正权最短路。

2. 顶点、方向与权重​

课程 A 是 B 的前置,可表示为 A → B。双向道路用无向边,单行道路用有向边。距离不同时,最少边数与最短距离是不同目标。

0: [1, 2]
1: [2]
2: []

这是有向邻接表,边为 0→1、0→2、1→2。线性扫描 0 的邻居即可查询 0→2。成本为 O(deg(0)),deg 表示出度。邻接矩阵查边为 O(1),但需存储 V² 个位置。

3. 搜索与访问状态​

邻接表完整搜索耗时 O(V+E)。矩阵逐行找邻居需 O(V²)。无向边各存两次,仍为 O(V+E) 空间。

入队时记录访问状态,可避免重复扩展。实现见树与图搜索。

4. 连通分量与可达性​

无向图中,从一个顶点出发可访问其整个连通分量。遍历全体顶点,并对未访问点启动搜索,即可统计分量数。

有向图需要区分可达、弱连通和强连通。弱连通忽略边方向,强连通要求分量内任意两点互达。对 0→1,0 能到 1,1 却无法回到 0。它有一个弱连通分量、两个强连通分量。

在有向图上反复搜索并计数,会受起点顺序影响。强连通分量可按岗位需要学习 Tarjan 或 Kosaraju 算法。

5. 使用边界​

隐式图需定义状态身份和合法邻居。网格节点可用行列坐标表示。路径枚举的状态恢复见回溯。

边权与目标方法与条件
等正权最短路BFS 按边数扩展。
0 或 1 权重0-1 BFS 用双端队列维护距离顺序。
非负权最短路Dijkstra 按当前最小距离扩展。
含负权最短路Bellman-Ford 可检测源点可达的负环。

若可达负环还能通往目标,可反复绕环降低路径代价。此时源点到目标没有有限的最短距离。

6 · 面试题卡片​

本页题目与参考回答

6.1 邻接表和邻接矩阵如何选择?​

考察重点:存储规模、查边和遍历邻居。

相关内容:顶点、方向与权重。

参考回答

稀疏图适合邻接表,空间为 O(V+E)。

矩阵查边为 O(1),适合可容纳 V² 空间的频繁查边任务。完整遍历邻接表为 O(V+E),扫描矩阵为 O(V²)。

6.2 有向图从一个起点搜索后,能得到强连通分量吗?​

考察重点:单向可达与相互可达。

相关内容:连通分量与可达性。

参考回答

一次搜索得到起点的可达集合,其中节点未必互达。

0→1 就是反例。强连通分量要求任意两点都能互相到达,需要专门的分量算法。

6.3 边权改变时,最短路径算法如何选择?​

考察重点:等权、非负权与负环。

相关内容:使用边界。

参考回答

等正权可用 BFS,0/1 权可用 0-1 BFS。

一般非负权可用 Dijkstra,含负权可用 Bellman-Ford。可达负环若还能通往目标,就没有有限最短距离。

7. 参考资料​