classSolution(object): defcalcEquation(self, equations, values, queries): from collections import defaultdict self.graph = defaultdict(set) self.weight = defaultdict() for idx, equ in enumerate(equations): self.graph[equ[0]].add(equ[1]) self.graph[equ[1]].add(equ[0]) self.weight[tuple(equ)] = values[idx] self.weight[(equ[1], equ[0])] = 1 / values[idx] res = [] for que in queries: t = self.dfs(start=que[0], end=que[1], visited=set()) if t == 0: t = -1.0 res.append(t) return res
defdfs(self, start, end, visited): if (start, end) in self.weight: return self.weight[(start, end)] if start notin self.graph or end notin self.graph: return0 if start in visited: return0 visited.add(start) res = 0 for tmp in self.graph[start]: res = (self.dfs(tmp, end, visited) * self.weight[(start, tmp)]) if res != 0: self.weight[(start, end)] = res break visited.remove(start) return res
if __name__ == '__main__': s = Solution() equations = [["a","e"],["b","e"]] values = [4.0,3.0] queries = [["a","b"],["e","e"],["x","x"]] print(s.calcEquation(equations=equations, values=values, queries=queries))