题目描述
给若干等式 a/b=value,回答查询 x/y 的结果。
equations = a/b=2, b/c=3
查询 = a/c
输出 = 6
思路解析
关键不是背模板,而是看懂为什么这题适合图 · 带权路径。
1. a/b=2,建边 a→b 权 2:a/b=2,建边 a→b 权 2
2. 同时建反边 b→a 权 1/2:同时建反边 b→a 权 1/2
3. b/c=3,建边 b→c 权 3:b/c=3,建边 b→c 权 3
4. 查询 a/c,从 a 做 DFS:查询 a/c,从 a 做 DFS
5. 走 a→b,乘积变 2:走 a→b,乘积变 2
6. 走 b→c,乘积变 6:走 b→c,乘积变 6
7. 到达 c,返回 6:到达 c,返回 6
8. 如果任一变量不存在,返回 -1:如果任一变量不存在,返回 -1
把这句话记住,下次遇到同类题,就能更快选出方向。
用一个小问题检查自己是不是真的懂了。
参考代码(Python)
Python
1class Solution:
2 def calcEquation(self, equations, values, queries):
3 g = {}
4 for (a, b), v in zip(equations, values):
5 g.setdefault(a, []).append((b, v))
6 g.setdefault(b, []).append((a, 1 / v))
7 def dfs(x, y, seen):
8 if x not in g or y not in g:
9 return -1.0
10 if x == y:
11 return 1.0
12 seen.add(x)
13 for nei, w in g[x]:
14 if nei not in seen:
15 sub = dfs(nei, y, seen)
16 if sub != -1.0:
17 return w * sub
18 return -1.0
19 return [dfs(a, b, set()) for a, b in queries]复杂度分析
- 时间复杂度:O(Q·(V+E)) —— 每个核心状态按算法要求处理固定次数
- 空间复杂度:O(V+E) —— 只保存必要的辅助结构或递归栈
套路模板
模板不是死背,而是提醒你写代码前先把状态、转移和边界排好。
Python
1# 图 · 带权路径 通用检查表
2# 1. 定义状态/指针/容器
3# 2. 每轮只做一个清晰动作
4# 3. 更新答案并处理边界易错点
- 错误写法:只存 a→b,不存 b→a → 正确写法:除法关系要双向建边(查询 b/a 需要反边)
- 错误写法:只按样例推代码 → 正确写法:先写清状态含义和边界条件(样例太少,隐藏用例专打边界)
- 错误写法:变量名和动画不一致 → 正确写法:代码变量沿用动画里的核心名字(学习时最怕脑内维护两套概念)
以上文字与上方动画完全同一思路:先看动画建立直觉 → 读文字巩固 → 关掉页面自己默写一遍代码,能写出来才算真的掌握。