class Solution {
public double maxProbability(int n, int[][] edges, double[] succProb, int start, int end) {
List<List<Pair<Integer, Double>>> adj = new ArrayList();
for(int i = 0; i < n; i++) {
adj.add(new ArrayList());
}
for(int i = 0; i < edges.length; i++) {
adj.get(edges[i][0]).add(new Pair(edges[i][1], succProb[i]));
adj.get(edges[i][1]).add(new Pair(edges[i][0], succProb[i]));
}
double[] maxProb = new double[n];
maxProb[start] = 1d;
PriorityQueue<Pair<Integer, Double>> pq = new PriorityQueue<>((a, b) -> -Integer.compare(a.getKey(), b.getKey()));
pq.offer(new Pair(start, maxProb[start]));
while(!pq.isEmpty()) {
Pair<Integer, Double> pair = pq.poll();
int current = pair.getKey();
double prob = pair.getValue();
if (prob < maxProb[current]) continue;
maxProb[current] = prob;
for (Pair<Integer, Double> node : adj.get(current)) {
if (node.getValue() * prob > maxProb[node.getKey()]) {
pq.offer(new Pair(node.getKey(), node.getValue() * prob));
}
}
}
return maxProb[end];
}
}