JavaInterview JavaInterview
首页
指南
分类
标签
归档
  • CSDN (opens new window)
  • 文档集合 (opens new window)
  • 系统架构 (opens new window)
  • 微信号 (opens new window)
  • 公众号 (opens new window)

『Java面试+Java学习』
首页
指南
分类
标签
归档
  • CSDN (opens new window)
  • 文档集合 (opens new window)
  • 系统架构 (opens new window)
  • 微信号 (opens new window)
  • 公众号 (opens new window)
  • 指南
  • 简历

  • Java

  • 面试

  • 算法

  • algorithm
  • leetcode
JavaInterview.cn
2025-05-06
目录

概率最大的路径Java

文章发布较早,内容可能过时,阅读注意甄别。

# 题目

给你一个由 n 个节点(下标从 0 开始)组成的无向加权图,该图由一个描述边的列表组成,其中 edges[i] = [a, b] 表示连接节点 a 和 b 的一条无向边,且该边遍历成功的概率为 succProb[i] 。

指定两个节点分别作为起点 start 和终点 end ,请你找出从起点到终点成功概率最大的路径,并返回其成功概率。

如果不存在从 start 到 end 的路径,请 返回 0 。只要答案与标准答案的误差不超过 1e-5 ,就会被视作正确答案。

示例 1:

1558_ex1.png

输入:n = 3, edges = [[0,1],[1,2],[0,2]], succProb = [0.5,0.5,0.2], start = 0, end = 2
输出:0.25000
解释:从起点到终点有两条路径,其中一条的成功概率为 0.2 ,而另一条为 0.5 * 0.5 = 0.25

示例 2:

1558_ex2.png

输入:n = 3, edges = [[0,1],[1,2],[0,2]], succProb = [0.5,0.5,0.3], start = 0, end = 2
输出:0.30000

示例 3:

1558_ex3.png

输入:n = 3, edges = [[0,1]], succProb = [0.5], start = 0, end = 2
输出:0.00000
解释:节点 0 和 节点 2 之间不存在路径

提示:

  • 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
  • 每两个节点之间最多有一条边

# 思路

链式前向星+dijkstra+堆优化

# 解法

class Solution {
    int[] he, e, ne;
    double[] w;
    int n, cnt, m;

    void add(int a, int b, double c) {
        ne[cnt] = he[a];
        e[cnt] = b;
        w[cnt] = c;
        he[a] = cnt++;
    }

    public double maxProbability(int _n, int[][] edges, double[] prob, int start_node, int end_node) {
        n = _n;
        m = edges.length * 2 + 10;
        he = new int[n];
        e = new int[m];
        w = new double[m];
        ne = new int[m];
        Arrays.fill(he, -1);
        for (int i = 0; i < edges.length; ++i) {
            add(edges[i][0], edges[i][1], prob[i]);
            add(edges[i][1], edges[i][0], prob[i]);
        }
        return dijkstra(start_node, end_node);
    }

    double dijkstra(int start, int end) {
        double[] dist = new double[n];
        dist[start] = 1.0;
        boolean[] visited = new boolean[n];
        PriorityQueue<Pair<Integer, Double>> heap = new PriorityQueue<>((a, b) -> Double.compare(b.getValue(), a.getValue()));
        heap.offer(new Pair<>(start, 1.0));
        while (!heap.isEmpty()) {
            Pair<Integer, Double> poll = heap.poll();
            int u = poll.getKey();
            if (u == end) return dist[u];
            if (visited[u]) continue;
            visited[u] = true;
            for (int i = he[u]; i != -1; i = ne[i]) {
                int to = e[i];
                if (dist[to] < dist[u] * w[i]) {
                    dist[to] = dist[u] * w[i];
                    heap.offer(new Pair<>(to,dist[to]));
                }
            }
        }
        return 0;
    }
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51

# 总结

  • 分析出几种情况,然后分别对各个情况实现
微信 支付宝
#Java
最近更新
01
1686. 石子游戏VI Java
08-18
02
1688. 比赛中的配对次数 Java
08-18
03
1687. 从仓库到码头运输箱子 Java
08-18
更多文章>
Theme by Vdoing | Copyright © 2019-2025 JavaInterview.cn
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式