# 0399. Evaluate Division ###### tags: `Leetcode` `Medium` `FaceBook` `BFS` `DFS` `Graph` Link: https://leetcode.com/problems/evaluate-division/ ## 思路 O(MN) O(N) M是query数量 N是equation数量 建图,然后DFS搜寻 **如果每走一步,都有值要更新,并且这个值与下面走到哪个node有关,就不要用iterative的方法做DFS,用recursive做backtracking** **做backtracking的时候如果更改了前面某个变量的值,call function结束之后一定要复原** 例如:[0797. All Paths From Source to Target](https://hackmd.io/UkM9NX9GS_-cJpuOqcJCIA) 时间复杂度解释:For each query, we need to traverse the graph. In the worst case, we might need to traverse the entire graph, which could take O(N). ## Code ```java= class Solution { public double[] calcEquation(List<List<String>> equations, double[] values, List<List<String>> queries) { Map<String, Map<String, Double>> graph = new HashMap<>(); buildGraph(equations, values, graph); double[] res = new double[queries.size()]; for(int i = 0;i < queries.size();i++){ if(!graph.containsKey(queries.get(i).get(0)) || !graph.containsKey(queries.get(i).get(1))){ res[i] = -1.0; continue; } Set<String> visited = new HashSet<>(); res[i] = compute(graph, queries.get(i).get(0), queries.get(i).get(1), visited); } return res; } public void buildGraph(List<List<String>> equations, double[] values, Map<String, Map<String, Double>> graph){ for(int i = 0;i < equations.size();i++){ List<String> equation = equations.get(i); String u = equation.get(0); String v = equation.get(1); if(!graph.containsKey(u)) graph.put(u, new HashMap<String, Double>()); if(!graph.containsKey(v)) graph.put(v, new HashMap<String, Double>()); graph.get(u).put(v, values[i]); graph.get(v).put(u, 1/values[i]); } } public double compute(Map<String, Map<String, Double>> graph, String u, String v, Set<String> visited){ visited.add(u); if(graph.get(u).containsKey(v)){ return graph.get(u).get(v); } for(String next:graph.get(u).keySet()){ if(!visited.contains(next)){ double res = compute(graph, next, v, visited); if(res != -1){ return graph.get(u).get(next)*res; } } } return -1; } } ```