加载中...
1514-概率最大的路径(Path with Maximum Probability)
发表于:2021-12-03 | 分类: 中等
字数统计: 941 | 阅读时长: 4分钟 | 阅读量:

原文链接: https://leetcode-cn.com/problems/path-with-maximum-probability

英文原文

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.

中文题目

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

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

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

 

示例 1:

输入: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:

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

示例 3:

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

通过代码

高赞题解

思路

  1. bfs + priority_queue
  2. 因为概率都是越乘越小,所以第一次从优先队列里出来标记个 vi 就好了

答题

[]
double maxProbability(int n, vector<vector<int>>& edges, vector<double>& succProb, int start, int end) { vector<bool> vi(n, false); vector<vector<pair<double, int>>> path(n, vector<pair<double, int>>()); for (int i = 0; i < edges.size(); i++) { auto& e = edges[i]; path[e[0]].push_back({ succProb[i], e[1] }); path[e[1]].push_back({ succProb[i], e[0] }); } priority_queue<pair<double, int>> pq; pq.push({ 1, start }); while (!pq.empty()) { auto [curProb, cur] = pq.top(); pq.pop(); if (vi[cur]) continue; vi[cur] = true; if (cur == end) return curProb; for (auto [nextProb, next] : path[cur]) { if (vi[next]) continue; pq.push({ curProb * nextProb, next }); } } return 0; }

致谢

感谢您的观看,希望对您有帮助,欢迎热烈的交流!

如果感觉还不错就点个赞吧~

这是 我的leetcode ,帮助我收集整理题目,可以方便的 visual studio 调试,欢迎关注,star

统计信息

通过次数 提交次数 AC比率
8691 26026 33.4%

提交历史

提交时间 提交结果 执行时间 内存消耗 语言
上一篇:
1706-球会落何处(Where Will the Ball Fall)
下一篇:
1862-向下取整数对和(Sum of Floored Pairs)
本文目录
本文目录