4.10 综合练习
"练习是检验理解的唯一标准。" — 教学原则
层次一:基础证明
练习 1:DFS 环检测
题目:证明 DFS 发现后向边当且仅当图有环。
提示:
- (→)后向边 u → v 意味着 v 是 u 的祖先
- (←)DFS 沿环遍历,最后一条边指向灰色顶点
练习 2:切割性质证明
题目:用切割性质证明 Kruskal 算法的正确性。
提示:
- 每次选择最小边 e
- 证明 e 必在某棵 MST 中(使用切割性质)
- 归纳完成
练习 3:Dijkstra 追踪
题目:手动追踪 Dijkstra 优先队列状态。
图结构:
A --4--> B --1--> C
| | |
1 2 5
v v v
D --3--> E --2--> F
源点:A要求:
- 画出优先队列的每一步状态
- 记录每次取出的顶点和距离更新
- 写出最终的最短路径树
练习 4:白色路径定理
题目:证明白色路径定理。
陈述:顶点 v 是顶点 u 的后代,当且仅当在发现 u 时,存在一条从 u 到 v 的全由白色顶点组成的路径。
练习 5:并查集复杂度
题目:计算并查集路径压缩后的树高度。
初始:10 个顶点,各自为根
操作:
union(0, 1), union(2, 3), union(4, 5), union(6, 7), union(8, 9)
union(0, 2), union(4, 6), union(0, 4), union(0, 8)
find(9) # 触发路径压缩
问题:
1. 画出路径压缩后的树结构
2. 计算树高度
3. 解释 α(n) 为什么 ≤ 4层次二:LLM 协同
练习 6:课程排课建模
场景:某专业有 8 门必修课,先修关系如下:
- C1 需要先修 C0
- C2 需要先修 C0
- C3 需要先修 C1, C2
- C4 需要先修 C3
- C5 需要先修 C3
- C6 需要先修 C4, C5
- C7 需要先修 C6
LLM 任务:
让 LLM:
1. 建模为图问题(定义顶点、边)
2. 实现拓扑排序
3. 求合法修课顺序人判断:
- 建模是否正确?
- 是否包含环检测?
- 如果加入约束"C5 需要先修 C7",会发生什么?
练习 7:网络路由建模
场景:某网络有 6 个路由器,延迟矩阵:
R1 R2 R3 R4 R5 R6
R1 0 10 inf 30 inf inf
R2 10 0 20 inf inf inf
R3 inf 20 0 10 20 inf
R4 30 inf 10 0 inf 20
R5 inf inf 20 inf 0 10
R6 inf inf inf 20 10 0LLM 任务:
让 LLM:
1. 建模为图问题
2. 选择合适的最短路径算法
3. 求 R1 到所有路由器的最短路径人判断:
- 建模是否正确?
- 算法选择是否正确(为什么不用 Bellman-Ford)?
- 如果 R3→R4 的延迟变为 -5,还能用 Dijkstra 吗?
练习 8:物流分配建模
场景:某物流公司有 3 个仓库、5 个配送中心、10 个零售商。每条运输线有容量限制。
LLM 任务:
让 LLM:
1. 建模为网络流问题
2. 定义源点、汇点
3. 解释容量约束人判断:
- 建模是否正确?
- 容量约束是否正确建模?
- 如何从最大流结果得到实际配送方案?
练习 9:LLM 实现拓扑排序
LLM 任务:
让 LLM 实现拓扑排序。
图结构:
顶点:{A, B, C, D, E}
边:A→B, A→C, B→D, C→D, D→E
要求:
1. 使用 Kahn 算法(入度法)
2. 包含环检测
3. 如果有环,返回错误人判断:
- 构造让 LLM 忽略环检测的测试用例
- 例如:添加边 E→A,形成环
练习 10:LLM 选择最短路径算法
场景:
| 场景 | 顶点数 | 边数 | 权重特征 | 任务 |
|---|---|---|---|---|
| A | 10^4 | 10^5 | 非负 | 单源 |
| B | 10^4 | 10^5 | 可能有负 | 单源 |
| C | 10^3 | 10^6 | 非负 | 全源 |
| D | 10^6 | 10^7 | 非负 | 单源 |
LLM 任务:
对每个场景,让 LLM 选择最短路径算法,并解释理由。人判断:
- LLM 的选择是否正确?
- 理由是否充分?
- 是否考虑了稀疏性?
层次三:Agent 设计
练习 11:图建模 Agent
目标:设计一个 Agent,输入自然语言问题描述,自动识别是否为图问题,建模为图,选择算法。
设计要点:
输入:自然语言问题描述
输出:
- 是否为图问题(布尔值 + 置信度)
- 图建模(顶点、边、权)
- 推荐算法类别
- 算法选择理由
流程:
1. 关键词识别(依赖、路径、分配、连通)
2. 实体抽取(识别可能的顶点和边)
3. 关系建模(定义边和权重)
4. 算法匹配(基于图特性选择)
5. 置信度评估测试用例:
- "课程排课问题"
- "配送路线优化"
- "社交网络好友推荐"
- "蛋白质相互作用分析"
练习 12:知识图谱 RAG Agent
目标:设计一个 Agent,基于知识图谱进行问答。
设计要点:
输入:自然语言问题
输出:答案 + 推理路径
流程:
1. 实体识别(从问题中提取实体)
2. 关系抽取(识别问题中的关系)
3. KG 查询(构建 SPARQL 或图遍历)
4. 路径检索(BFS/DFS 找相关路径)
5. 上下文构建(将路径转为文本)
6. LLM 生成答案示例:
问题:"姚明的妻子的出生地是哪里?"
推理路径:
姚明 → 配偶 → 叶莉 → 出生地 → 上海
答案:"姚明的妻子叶莉出生于上海。"练习 13:推理验证 Agent
目标:设计一个 Agent,验证 LLM 推理链的一致性。
设计要点:
输入:LLM 的推理链(文本)
输出:
- 推理图(DAG)
- 一致性评估(通过/警告/失败)
- 问题列表(如有)
流程:
1. 解析推理链(识别前提和结论)
2. 构建推理图(DAG)
3. 检测循环矛盾(环检测)
4. 检查前提完整性
5. 验证推理步骤示例:
推理链:
"所有猫都是动物。Tom 是一只猫。所以 Tom 是动物。"
推理图:
P1: 所有猫 → 动物
P2: Tom → 猫
C: Tom → 动物
一致性:通过练习 14:图算法选择 Skill
目标:设计一个 Skill,输入图特性,自动选择算法和表示。
设计要点:
输入:
- 图特性(顶点数、边数、是否有向、是否有权)
- 任务类型(遍历、最短路、生成树、流)
- 特殊约束(负权、环检测)
输出:
- 推荐的图表示
- 推荐的算法
- 复杂度预估
- 实现代码
决策树:
- E << V² → 邻接表
- E ≈ V² → 邻接矩阵
- 单源最短路 + 非负权 → Dijkstra
- 单源最短路 + 可能负权 → Bellman-Ford
- 全源最短路 + 稠密 → Floyd-Warshall小结
层次一:基础证明和手工计算,巩固理论理解。
层次二:LLM 协同练习,培养审查和判断能力。
层次三:Agent 设计,综合应用人机分工原则。
评分标准
| 层次 | 通过标准 |
|---|---|
| 层次一 | 正确完成 3/5 题 |
| 层次二 | 正确判断 4/5 题 |
| 层次三 | 完成 2/4 个设计 |