class Solution {
    public void addArc(Map<String, Map<String, Double>> graph, String vexStart, String vexEnd, double value) {
        Map<String, Double> arcMap;
        if (graph.containsKey(vexStart)) {
            arcMap = graph.get(vexStart);
        } else {
            arcMap = new HashMap<>();
        }
        arcMap.put(vexEnd, value);
        graph.put(vexStart, arcMap);
    }

    public double getValue(Map<String, Map<String, Double>> graph, String vexStart, String vexEnd, double cur, Set<String> v) {
        //if (v.contains(vexStart)) return 0.0;
        if (!graph.containsKey(vexStart) || !graph.containsKey(vexEnd)) return -1.0;
        if (vexStart.equals(vexEnd)) return cur;
        double ans = 0.0;
        v.add(vexStart);
        for (Map.Entry<String,Double> arc: graph.get(vexStart).entrySet()){
            if (!v.contains(arc.getKey())){
                 v.add(arc.getKey());

                ans = getValue(graph, arc.getKey(), vexEnd, 1.0*cur *arc.getValue(),v);
                v.remove(arc.getKey());
                 if (ans != -1.0) return ans;
            }
        }
        return -1.0;
    }

    public double[] calcEquation(String[][] equations, double[] values, String[][] queries) {

        Map<String, Map<String, Double>> graph = new HashMap<>();

        for (int i = 0; i < equations.length; i++) {
            //add arcs for both directions
            addArc(graph, equations[i][0], equations[i][1], values[i]);
            addArc(graph, equations[i][1], equations[i][0], 1 / values[i]);
        }

        double[] answer = new double[queries.length];
        for (int i = 0; i < answer.length; i++) {
            answer[i] = getValue(graph, queries[i][0], queries[i][1],1,new HashSet<>());
        }

        return answer;
    }
}

results matching ""

    No results matching ""