Path with Maximum Probability
Link
Description
You are given an undirected weighted graph of n
nodes (0-indexed), represented by an edge list where edges[i] = [a, b]
is an undirected edge connecting the nodes a
and b
with a probability of success of traversing that edge succProb[i]
.
Given two nodes start
and end
, find the path with the maximum probability of success to go from start
to end
and return its success probability.
If there is no path from start
to end
, return 0
. Your answer will be accepted if it differs from the correct answer by at most 1e-5
.
Example 1:
- Input:
n = 3, edges = [[0,1],[1,2],[0,2]], succProb = [0.5,0.5,0.2], start = 0, end = 2
- Output:
0.25000
- Explanation:
There are two paths from start to end, one having a probability of success = 0.2 and the other has 0.5 * 0.5 = 0.25.
Example 2:
- Input:
n = 3, edges = [[0,1],[1,2],[0,2]], succProb = [0.5,0.5,0.3], start = 0, end = 2
- Output:
0.30000
Example 3:
- Input:
n = 3, edges = [[0,1]], succProb = [0.5], start = 0, end = 2
- Output:
0.00000
- Explanation:
There is no path between 0 and 2.
Constraints:
2 <= n <= 10^4
0 <= start, end < n
start != end
0 <= a, b < n
a != b
0 <= succProb.length == edges.length <= 2*10^4
0 <= succProb[i] <= 1
- There is at most one edge between every two nodes.
Solution
See reference (Chinese).
| class Solution {
public:
double maxProbability(int n, vector<vector<int>>& edges, vector<double>& succProb, int start_node, int end_node) {
using PDI = pair<double, int>;
vector<vector<PDI>> graph(n);
for (int i = 0; i < edges.size(); i++) {
graph[edges[i][0]].emplace_back(succProb[i], edges[i][1]);
graph[edges[i][1]].emplace_back(succProb[i], edges[i][0]);
}
priority_queue<PDI> que;
que.emplace(1.0, start_node);
vector<double> prob(n, 0.0);
prob[start_node] = 1.0;
while (!que.empty()) {
auto [currentProb, node] = que.top();
que.pop();
if (currentProb < prob[node]) continue;
for (auto& [nextProb, nextNode] : graph[node]) {
if (prob[nextNode] < prob[node] * nextProb) {
prob[nextNode] = prob[node] * nextProb;
que.emplace(prob[nextNode], nextNode);
}
}
}
return prob[end_node];
}
};
|
- Time complexity: \(O(m\log m)\), where \(m\) is the number of edges in the graph;
- Space complexity: \(O(m)\).
Another way of writing:
| class Solution {
public:
double maxProbability(int n, vector<vector<int>>& edges, vector<double>& succProb, int start_node, int end_node) {
using PDI = pair<double, int>;
vector<vector<PDI>> graph(n);
for (int i = 0; i < edges.size(); i++) {
graph[edges[i][0]].emplace_back(succProb[i], edges[i][1]);
graph[edges[i][1]].emplace_back(succProb[i], edges[i][0]);
}
priority_queue<PDI> que;
que.emplace(1.0, start_node);
vector<double> prob(n, 0.0);
prob[start_node] = 1.0;
while (!que.empty()) {
auto [currentProb, node] = que.top();
que.pop();
if (node == end_node) return currentProb;
for (auto& [nextProb, nextNode] : graph[node]) {
if (prob[nextNode] < prob[node] * nextProb) {
prob[nextNode] = prob[node] * nextProb;
que.emplace(prob[nextNode], nextNode);
}
}
}
return 0.0;
}
};
|