class Solution {
public double maxAmount(String initialCurrency, List<List<String>> pairs1, double[] rates1, List<List<String>> pairs2, double[] rates2) {
Map<String, List<Edge>> day1 = buildGraph(pairs1, rates1);
Map<String, List<Edge>> day2 = buildGraph(pairs2, rates2);
Deque<Edge> queue = new ArrayDeque<>();
Map<String, Double> maxConversions = initConversions(day1.keySet());
maxConversions.put(initialCurrency, 1.0);
queue.offer(new Edge(initialCurrency,1.0));
bfs(maxConversions, day1, queue);
queue.clear();
for(Map.Entry<String,Double> entry : maxConversions.entrySet()){
String currency = entry.getKey();
double rate = entry.getValue();
if(rate > 0.0){
queue.offer(new Edge(currency, rate));
}
}
bfs(maxConversions, day2, queue);
return maxConversions.getOrDefault(initialCurrency, 1.0);
}
public void bfs(Map<String, Double> maxConversions, Map<String, List<Edge>> day, Deque<Edge> queue){
while(!queue.isEmpty()){
Edge edge = queue.poll();
String currency = edge.currency;
double rate = edge.rate;
for(Edge neighbor : day.getOrDefault(currency, new ArrayList<>())){
String nCurrency = neighbor.currency;
double nRate = neighbor.rate;
if(nRate * rate > maxConversions.getOrDefault(nCurrency, 0.0)){
maxConversions.put(nCurrency,nRate*rate);
queue.offer(new Edge(nCurrency, nRate*rate));
}
}
}
}
public Map<String, Double> initConversions(Set<String> currencies){
Map<String, Double> maxConversions = new HashMap<>();
for(String currency : currencies){
maxConversions.put(currency, 0.0);
}
return maxConversions;
}
public Map<String, List<Edge>> buildGraph(List<List<String>> pairs, double[] rates){
Map<String, List<Edge>> graph = new HashMap<>();
for(int i = 0; i < pairs.size(); i++){
String source = pairs.get(i).get(0);
String target = pairs.get(i).get(1);
double rate = rates[i];
graph.computeIfAbsent(source, k -> new ArrayList<>()).add(new Edge(target, rate));
graph.computeIfAbsent(target, k -> new ArrayList<>()).add(new Edge(source, 1.0/rate));
}
return graph;
}
class Edge{
String currency;
double rate;
public Edge(String cur, double rt){
currency = cur;
rate = rt;
}
}
}