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.
题目链接:https://leetcode.com/problems/path-with-maximum-probability/
题目大意:求从起点到终点的最大概率路径
题目分析:权值乘套对数变成权值加,于是变成最长路问题,因为log函数是单增的,于是取相反数变成最短路问题,边数不多故直接spfa
27ms,时间击败97.1%
class Solution {
class Edge {
int to, nxt;
double val;
void Edge() {}
void Edge(int nxt, double val) {
this.nxt = nxt;
this.val = val;
}
}
Edge[] e;
int cnt;
int[] head;
double[] dist;
boolean[] vis;
void init(int n, int m) {
cnt = 0;
head = new int[n];
Arrays.fill(head, -1);
e = new Edge[m << 1];
for (int i = 0; i < m << 1; i++) {
e[i] = new Edge();
}
dist = new double[n];
vis = new boolean[n];
Arrays.fill(vis, false);
}
void addEdge(int u, int v, double val) {
e[cnt].to = v;c
e[cnt].val = -Math.log(val);
e[cnt].nxt = head[u];
head[u] = cnt++;
e[cnt].to = u;
e[cnt].val = -Math.log(val);
e[cnt].nxt = head[v];
head[v] = cnt++;
}
void spfa(int st) {
Queue<Integer> q = new LinkedList<Integer>();
q.offer(st);
vis[st] = true;
Arrays.fill(dist, 1.0 * Integer.MAX_VALUE);
dist[st] = 0;
while (!q.isEmpty()) {
int u = q.poll();
vis[u] = false;
for (int i = head[u]; i != -1; i = e[i].nxt) {
int v = e[i].to;
if (dist[v] > dist[u] + e[i].val) {
dist[v] = dist[u] + e[i].val;
q.offer(v);
vis[v] = true;
}
}
}
}
public double maxProbability(int n, int[][] edges, double[] succProb, int start, int end) {
int m = edges.length;
init(n, m);
for (int i = 0; i < m; i++) {
addEdge(edges[i][0], edges[i][1], succProb[i]);
}
spfa(start);
// for (int i = 0; i < n; i++) {
// System.out.println("dist["+i+"] = " + dist[i]);
// }
return Math.pow(Math.exp(1), -dist[end]);
}
}