5211. 概率最大的路径(C++)---广度优先搜索解题

题目详情

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

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

如果不存在从 start 到 end 的路径,请 返回 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
  • 每两个节点之间最多有一条边

 

——题目难度:中等


 




-代码如下

class Solution {
public:
    double maxProbability(int n, vector>& edges, vector& succProb, int start, int end) {
    	/*构建邻接矩阵*/ 
		vector>> graph(n);
		for(int i = 0; i < edges.size(); i++) {
			graph[edges[i][0]].push_back({edges[i][1], succProb[i]});
			graph[edges[i][1]].push_back({edges[i][0], succProb[i]});
		}
		
		vector prob_max(n);
		queue> q;
		q.push({start, 1.0});
		prob_max[start] = 1.0;
		
		/*广度优先搜索*/ 
		while (!q.empty()) {
			pair temp1 = q.front();
			q.pop();
			for(auto& v : graph[temp1.first]) {
				double temp2 = temp1.second * v.second;
				if (v.first == end) {
					prob_max[end] = max(prob_max[end], temp2);
					continue;
				}
				
				if (temp2 > prob_max[v.first]) { //这里可以防止走回头路 
					prob_max[v.first] = temp2;
					q.push({v.first, temp2});
				}
			}
		}
			
		return prob_max[end];
    }
};

5211. 概率最大的路径(C++)---广度优先搜索解题_第1张图片
 


 

你可能感兴趣的:(#,bfs,LeetCode-解题记录)