鱼C论坛

 找回密码
 立即注册
查看: 1306|回复: 1

[技术交流] C++刷LeetCode(5211. 概率最大的路径)【图】【广度优先搜索】

[复制链接]
发表于 2020-7-12 13:17:45 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

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

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



  4. 示例 1:



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



  9. 输入:n = 3, edges = [[0,1],[1,2],[0,2]], succProb = [0.5,0.5,0.3], start = 0, end = 2
  10. 输出:0.30000
  11. 示例 3:



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


  15. 提示:

  16. 2 <= n <= 10^4
  17. 0 <= start, end < n
  18. start != end
  19. 0 <= a, b < n
  20. a != b
  21. 0 <= succProb.length == edges.length <= 2*10^4
  22. 0 <= succProb[i] <= 1
  23. 每两个节点之间最多有一条边
复制代码


  1. class Solution {
  2. public:
  3.     double maxProbability(int n, vector<vector<int>>& edges, vector<double>& succProb, int start, int end) {
  4.         //广度优先搜索
  5.         //构建邻接矩阵
  6.         vector<vector<pair<int, double> > > graph(n);
  7.         for(int i = 0; i < edges.size(); i++) {
  8.             graph[edges[i][1]].push_back({edges[i][0], succProb[i]});
  9.             graph[edges[i][0]].push_back({edges[i][1], succProb[i]});
  10.         }
  11.         vector<double> prob_max(n);//这个向量构建是关键!!!
  12.         queue<pair<int, double>> store;
  13.         store.push({start, 1.0});
  14.         prob_max[start] = 1.0;
  15.         while(!store.empty()) {
  16.             pair<int, double> temp1 = store.front();
  17.             store.pop();
  18.             for(auto& cha : graph[temp1.first]) {
  19.                 double temp2 = temp1.second * cha.second;
  20.                 if(cha.first == end) {
  21.                     prob_max[end] = max(temp2, prob_max[end]);
  22.                     continue;
  23.                 }
  24.                 if(prob_max[cha.first] < temp2) {
  25.                     prob_max[cha.first] = temp2;
  26.                     store.push({cha.first, temp2});
  27.                 }
  28.             }
  29.         }
  30.         return prob_max[end];
  31.     }
  32. };
复制代码

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-7-12 16:18:58 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-27 19:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表