题解 | #牛群之间的体重比#
牛群之间的体重比
https://www.nowcoder.com/practice/75717e3241704b55a71ecc6bdbf6b9b4
- 题目考察的知识点 : 哈希,BFS
- 题目解答方法的文字分析:
- 使用字典 graph 存储图中的边和权重。对于每个等式
(a, b),在graph[a]中添加边(b, val),在graph[b]中添加边(a, 1/val)。 - 遍历查询列表 questions,对于每个查询
(start, end)进行如下操作:如果 start 或 end 不在 graph 中,则无法计算答案,将其设为 -1.0 并加入结果列表 res。如果 start 和 end 相同,则 a/a=1.0,将其设为 1.0 并加入结果列表 res。否则,使用广度优先搜索遍历从 start 出发能够到达的所有节点,并计算从 start 到当前节点所经过的边的权重之积,直到找到 end 或者遍历完图为止。如果找到了 end,则将从 start 到 end 所经过的边的权重之积加入结果列表 res,否则将其设为 -1.0 并加入结果列表 res。
- 本题解析所用的编程语言: Python
- 完整且正确的编程代码
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
#
# @param weightRatios string字符串二维数组
# @param ratioValues double浮点型一维数组
# @param questions string字符串二维数组
# @return double浮点型一维数组
#
from collections import defaultdict
class Solution:
def calcWeightRatios(
self,
weightRatios: List[List[str]],
ratioValues: List[float],
questions: List[List[str]],
) -> List[float]:
graph = defaultdict(dict)
# 构建图
for (a, b), val in zip(weightRatios, ratioValues):
graph[a][b] = val
graph[b][a] = 1.0 / val
# 处理查询
res = []
for start, end in questions:
if start not in graph or end not in graph:
res.append(-1.0)
elif start == end:
res.append(1.0)
else:
visited = set()
queue = [(start, 1)]
found = False
while queue and not found:
node, curr_prod = queue.pop(0)
visited.add(node)
for neighbor, edge_weight in graph[node].items():
if neighbor == end:
res.append(curr_prod * edge_weight)
found = True
break
if neighbor not in visited:
queue.append((neighbor, curr_prod * edge_weight))
if not found:
res.append(-1.0)
return res
牛客高频top202题解系列 文章被收录于专栏
记录刷牛客高频202题的解法思路
