1514 - Path with Maximum Probability
JAVA
class Solution { public double maxProbability(int n, int[][] edges, double[] succProb, int start, int end) { List<Pair<Integer, Double>>[] g = new List[n]; Arrays.setAll(g, k -> new ArrayList<>()); for (int i = 0; i < edges.length; ++i) { int a = edges[i][0], b = edges[i][1]; double s = succProb[i]; g[a].add(new Pair<>(b, s)); g[b].add(new Pair<>(a, s)); } PriorityQueue<Pair<Double, Integer>> q = new PriorityQueue<>(Comparator.comparingDouble(Pair::getKey)); double[] d = new double[n]; d[start] = 1.0; q.offer(new Pair<>(-1.0, start)); while (!q.isEmpty()) { Pair<Double, Integer> p = q.poll(); double w = p.getKey(); w *= -1; int u = p.getValue(); for (Pair<Integer, Double> ne : g[u]) { int v = ne.getKey(); double t = ne.getValue(); if (d[v] < d[u] * t) { d[v] = d[u] * t; q.offer(new Pair<>(-d[v], v)); } } } return d[end]; } }
C++
class Solution { public: double maxProbability(int n, vector<vector<int>>& edges, vector<double>& succProb, int start, int end) { vector<vector<pair<int, double>>> g(n); for (int i = 0; i < edges.size(); ++i) { int a = edges[i][0], b = edges[i][1]; double s = succProb[i]; g[a].push_back({b, s}); g[b].push_back({a, s}); } vector<double> d(n); d[start] = 1.0; queue<pair<double, int>> q; q.push({1.0, start}); while (!q.empty()) { auto p = q.front(); q.pop(); double w = p.first; int u = p.second; if (d[u] > w) continue; for (auto& e : g[u]) { int v = e.first; double t = e.second; if (d[v] < d[u] * t) { d[v] = d[u] * t; q.push({d[v], v}); } } } return d[end]; } };
Comments
Post a Comment