Untitled

 avatar
unknown
plain_text
a year ago
2.7 kB
4
Indexable
class Solution {
    class Triple {
        String destination;
        double weight;

        public Triple(String d, double w) {
            this.destination = d;
            double weight = w;
        }

    }

    public double[] calcEquation(List<List<String>> equations, double[] values, List<List<String>> queries) {
        HashMap<String, List<Triple>> adjList = new HashMap<>();
        HashMap<String, Boolean> nodes = new HashMap<>();

        for (int i = 0; i < equations.size(); i++) {
            String s1 = equations.get(i).get(0);
            String s2 = equations.get(i).get(1);

            double val = values[i];

            List<Triple> sourceNode = adjList.getOrDefault(s1, new ArrayList<Triple>());
            sourceNode.add(new Triple(s2, val));
            adjList.put(s1, sourceNode);

            List<Triple> destNode = adjList.getOrDefault(s2, new ArrayList<Triple>());
            destNode.add(new Triple(s1, 1.0 / val));
            adjList.put(s2, destNode);

            nodes.put(s1, false);
            nodes.put(s2, false);
        }

        HashMap<String, Boolean> visited = nodes;
        double[] result = new double[queries.size()];
        int i = 0;
        for (List<String> list : queries) { 
            String s = list.get(0);
            String d = list.get(1);

            if (!adjList.containsKey(s) || !adjList.containsKey(d)) {
                result[i] = -1.00;
                i++;
                continue;
            }

            if (s.equals(d)) {
                result[i] = 1.00;
                i++;
                continue;
            }

            visited = nodes;
            double ans = dfs(s, d, adjList, visited);

            if (ans == Double.MAX_VALUE) {
                result[i] = -1;
            }
            else {
                result[i] = ans;
            }
            i++;
        }

        return result;

    }

    private double dfs(String source, String dest, HashMap<String, List<Triple>> adjList, HashMap<String, Boolean> visited) {

        if (visited.getOrDefault(source, false)) {
            return Double.MAX_VALUE;
        }

        visited.put(source, true);
        double sum = Double.MAX_VALUE;

        for (Triple t : adjList.get(source)) {
            if (t.destination.equals(dest)) {
                sum = t.weight;
                break;
            }
            double val = dfs(t.destination, dest, adjList, visited);

            if (val != Double.MAX_VALUE) {
                sum = val * t.weight;
            }
        }

        return sum;
    }
}
Editor is loading...
Leave a Comment