Leetcode 1514 概率最大的路径

文章目录

  • 1. 题目描述
  • 2. 我的尝试

1. 题目描述

原题链接:Leetcode 1514 概率最大的路径

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

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

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

在这里插入图片描述

2. 我的尝试

该题本质上是一个单源汇最短路问题。每条边的长度就是该边遍历成功的概率,两点之间的路径长度就等于该路径上各边概率的乘积。这样,求 startend 的最大概率就相当于求 startend 的最短路。题目保证了各边概率不超过1,相当于保证了无负权值的边

求解单源汇无负权值的最短路问题,可以使用dijkstra算法。本题中节点个数 n 和边的个数 m 的范围分别是 2 ≤ n ≤ 1 0 4 2 \leq n \leq10^4 2n104 0 ≤ m ≤ 2 ∗ 1 0 4 0 \leq m \leq 2*10^4 0m2104 ,即节点个数与边的个数数量级相当,为稀疏图,因此考虑使用堆优化版本的dijkstra算法。时间复杂度为 O ( m × l o g ( n ) ) O(m \times log(n)) O(m×log(n))

const int N = 1e4 + 10;
const int M = 4e4 + 10;

class Solution {
public:
    int h[N], e[M], ne[M], idx;
    double w[M], d[N];
    bool st[N];
    priority_queue<pair<double, int>> heap;

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

    double dijkstra(int start, int end) {
        for (int i = 0; i < end; i ++) d[i] = 0;

        d[start] = 1;
        heap.push({1, start});

        while (heap.size()) {
            auto t = heap.top();
            heap.pop();

            double dist = t.first;
            int ver = t.second;

            if (st[ver]) continue;
            st[ver] = true;

            for (int i = h[ver]; i != -1; i = ne[i]) {
                int j = e[i];
                if (d[j] < d[ver] * w[i]) {
                    d[j] = d[ver] * w[i];
                    heap.push({d[j], j});
                }
            }
        }

        return d[end];
    }

    double maxProbability(int n, vector<vector<int>>& edges, vector<double>& succProb, int start_node, int end_node) {
        int m = edges.size();
        memset(h, -1, sizeof h);

        for (int i = 0; i < m; i++) {
            int a = edges[i][0], b = edges[i][1];
            double c = succProb[i];
            add(a, b, c);
            add(b, a, c);
        }

        return dijkstra(start_node, end_node);
    }
};

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/456204.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C#,数值计算,希尔伯特矩阵(Hilbert Matrix)的算法与源代码

Hilbert, David (1862-1943) 1 希尔伯特(Hilbert) 德国数学家,在《几何学基础》中提出了第一套严格的几何公理(1899年)。他还证明了自己的系统是自洽的。他发明了一条简单的空间填充曲线,即埃里克魏斯汀的数学世界,即希尔伯特曲线,埃里克魏斯汀的数学世界,并证明了不…

win11创建本地局域网网站

前言 本篇文章介绍在windows11环境下通过IIS(Internet Information Services)管理器创建局域网网站 启用windows相关功能 键盘win R打开运行窗口输入optionalfeatures&#xff0c;回车打开windows功能界面选中下面这几项,点击确定&#xff0c;稍等即可 打开IIS 按下win键…

3.1_6 基本地址变换机构

文章目录 3.1_6 基本地址变换机构&#xff08;一&#xff09;基本地址变换机构&#xff08;二&#xff09;对页表项大小的进一步探讨 总结 3.1_6 基本地址变换机构 提示&#xff1a; 重点理解、记忆**基本地址变换机构&#xff08;即用于实现逻辑地址到物理地址转换的一组硬件机…

网络层:地址解析协议ARP、网际控制报文协议ICMP、虚拟专用网络VPN、网络地址转换NAT

文章目录 地址解析协议ARP解决的问题ARP解析流程ARP高速缓存 网际控制报文协议ICMPICMP报文的种类ICMP差错报告报文ICMP询问报文 ICMP应用举例分组网间探测PING(Packet InterNet Groper)traceroute(tracert)确定路径的MTU 虚拟专用网络专用地址虚拟专用网络远程接入VPN(remote …

2024年文学、历史与艺术设计国际会议(ICLHAD2024)

2024年文学、历史与艺术设计国际会议(ICLHAD2024) 一、【会议简介】 2024国际文学、历史和艺术设计会议&#xff08;IACLHAD 2024&#xff09;将在中国杭州举行。本次大会将继续遵循学术性和国际性原则&#xff0c;邀请国内外高校、科研院所、企事业单位的文史美术设计领域的…

力扣每日一题 最大二进制奇数 模拟 贪心

Problem: 2864. 最大二进制奇数 由于奇数的二进制末尾一定是 111&#xff0c;我们可以把一个 111 放在末尾&#xff0c;其余的 111 全部放在开头&#xff0c;这样构造出的奇数尽量大。 复杂度 时间复杂度: O ( n ) O(n) O(n) 空间复杂度: O ( 1 ) O(1) O(1) Code class…

自动化运维工具Ansible

目录 一.Ansible基本内容 1.定义 2.特点与优势 优势&#xff1a; &#xff08;1&#xff09;轻便性&#xff1a;无需在被控制服务器上安装客户端&#xff0c;Ansible基于ssh协议 &#xff08;2&#xff09;幂等性&#xff1a;大部分模块有幂等性&#xff0c;即如果输入sys…

react 综合题-旧版

一、组件基础 1. React 事件机制 javascript 复制代码<div onClick{this.handleClick.bind(this)}>点我</div> React并不是将click事件绑定到了div的真实DOM上&#xff0c;而是在document处监听了所有的事件&#xff0c;当事件发生并且冒泡到document处的时候&a…

一文搞懂多模态:BeiT-3之前的14个多模态+4个周边原理解读

在人工智能的世界里&#xff0c;多模态学习不断地展现出其重要性。这个领域的迅速发展不仅促进了不同类型数据之间的深度融合&#xff0c;还为机器理解世界提供了更加丰富和细腻的视角。随着科技的不断演进&#xff0c;人工智能模型已经开始渐渐具备处理和理解从文本、图像&…

数组和指针

一、数组不可以被赋值 数组一旦声明之后&#xff0c;是不可以修改的&#xff0c;只有数组中的元素是可以被修改的 #include<stdio.h> int main() {int arr1[]{1,2,3};int arr2[]{7,8,9};arr1arr2;return 0; } 二、指针可以被赋值 指针可以通过赋值指向其他内存空间 #…

flutter 开发app可以做的事情

热更新文件/图片 预览组件/文件上传分片/动态多语言/兼容web缓存管理页面动画封装公用组件库日志系统/日志规范/错误定位低代码实现/探索/落地网络延迟脚本字体包优化web 页面浏览器刷新没有历史路径&#xff0c;导致报错选择多语言之后&#xff0c;退出再次进入&#xff0c;没…

Excel生成 chart 混合图表

在开发中有这样一个需求&#xff0c;邮件预警的时候&#xff0c;要求邮件主体内容是一个Chart 图表&#xff08;生成后的img&#xff09;&#xff0c;邮件需要有附件&#xff0c;且附件是Excel列表加图表&#xff0c;图表类型是混合图。 回顾&#xff1a;在之前一篇讲到如何使用…

云数据库Redis配置用户名密码连接

一般情况&#xff0c;生产环境6379端口是禁止对外开放的&#xff0c; 所有用户名密码可以不设置。 但是如果有格鲁需求&#xff0c;需要开放redis公网访问&#xff0c;建议端口限制IP&#xff0c;并设置用户密码 spring中配置 阿里云数据库 云数据库 Redis_缓存数据库_高并…

数据分析可视化神器---streamlit框架,各种图表绘制,布局以及生产综合案例剖析

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

如何应用TRIZ点亮产品新概念设计的火花?

在创新设计的领域里&#xff0c;TRIZ&#xff08;发明问题解决理论&#xff09;被誉为一把开启创新之门的金钥匙。它能够帮助设计师和工程师突破思维定式&#xff0c;找到前所未有的解决方案。那么&#xff0c;如何在产品的新概念设计阶段&#xff0c;利用TRIZ点亮创新的火花呢…

玩转 Spring 状态机:更优雅的实现订单状态流转

说起 Spring 状态机&#xff0c;大家很容易联想到这个状态机和设计模式中状态模式的区别是啥呢&#xff1f;没错&#xff0c;Spring 状态机就是状态模式的一种实现&#xff0c;在介绍 Spring 状态机之前&#xff0c;让我们来看看设计模式中的状态模式。 1. 状态模式 状态模式…

探秘知乎的排名算法:知乎撰写高质量内容的秘诀

知乎作为一个知识问答社区&#xff0c;用户众多、内容繁杂&#xff0c;那么究竟是什么样的原则决定了知乎上的排名呢&#xff1f;腾轩科技传媒探讨知乎排名的规则&#xff0c;并分享如何撰写高质量的文章。 知乎排名的算法 在知乎这个巨大的社交平台上&#xff0c;任何一个用户…

torch.backends.cudnn.benchmark 作用

相关参数 torch.backends.cudnn.enabled torch.backends.cudnn.benchmark torch.backends.cudnn.deterministictorch.backends.cudnn.benchmark True&#xff1a;将会让程序在开始时花费一点额外时间&#xff0c;为整个网络的每个卷积层搜索最适合它的卷积实现算法&#xff0c…

【SysBench】Linux 安装 sysbench-1.20

安装目的是为了对 MySQL 8.0.x 、PostgreSQL 进行基准测试。 1、二进制包安装 在 Linux 上下载和安装 sysbench 最简单的方法是使用 托管的二进制包存储库 packagecloud 。存储库是在每个 sysbench 版本上自动更新。目前为 x86_64、i386 和 aarch64 二进制文件可用。 RHEL/C…

深入理解指针——C语言

目录 1. 内存和地址 2. 指针变量和地址 3. 指针变量类型的意义 4. const修饰指针 5. 指针运算 6. 野指针 7. assert断言 8. 指针的使用和传址调用 9. 数组名的理解 10. 使用指针访问数组 11. 一维数组传参的本质 12. 冒泡排序 13. 二级指针 14. 指针数组 15. 指…