Untitled
unknown
plain_text
a year ago
2.7 kB
14
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