首页 > 其他分享 >Leetcode 1514. 概率最大的路径

Leetcode 1514. 概率最大的路径

时间:2024-10-17 14:49:16浏览次数:10  
标签:node startNode int graph 路径 distsHeap 1514 Leetcode

1.题目基本信息

1.1.题目描述

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

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

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

1.2.题目地址

https://leetcode.cn/problems/path-with-maximum-probability/description/

2.解题方法

2.1.解题思路

Dijkstra算法+优先队列优化

2.2.解题步骤

第一步,构建邻接表

第二步,通过Dijkstra算法算出单源最长路径,将路径相加变成路径相乘

第三步,返回end_node的但源最长路径

3.解题代码

Python代码

from typing import List
import heapq
inf=float("inf")
# dijkstra最大路径模板
def dijkstraMaxDist(graph:List[List[List]],startNode:int):
    length=len(graph)
    dists=[0]*length  # *各个节点到startNode的最大概率
    dists[startNode]=1  # *初始化startNode到startNode的最大概率
    pathsPrevs=[-1]*length      # 最短路径的最后节点的前驱节点
    distsHeap=[[-1,startNode]]   # *距离优先队列,项的结构为[距离startNode的距离,node],需要构建最大堆,将权值取负
    while distsHeap:
        dist,node=heapq.heappop(distsHeap)
        dist=-dist
        if dist<dists[node]:    # *排除同一个
            continue
        for edgeWeight,subNode in graph[node]:
            thisDist=edgeWeight*dists[node]
            if thisDist>dists[subNode]: # *
                dists[subNode]=thisDist
                pathsPrevs[subNode]=node
                heapq.heappush(distsHeap,[-thisDist,subNode])    # *
    return dists,pathsPrevs


class Solution:
    def maxProbability(self, n: int, edges: List[List[int]], succProb: List[float], start_node: int, end_node: int) -> float:
        # 第一步,构建邻接表
        graph=[[] for i in range(n)]
        for i,edge in enumerate(edges):
            graph[edge[0]].append([succProb[i],edge[1]])
            graph[edge[1]].append([succProb[i],edge[0]])
        # 第二步,通过Dijkstra算法算出单源最长路径,将路径相加变成路径相乘
        probs,pathsPrevs=dijkstraMaxDist(graph,start_node)
        # print(probs,pathsPrevs)
        # 第三步,返回end_node的但源最长路径
        return probs[end_node]

C++代码

class Solution {
public:
    vector<double> dijkstraMaxDist(vector<vector<pair<double,int>>>& graph,int startNode){
        int length=graph.size();
        vector<double> dists(length,0);
        dists[startNode]=1;
        // vector<int> pathsPrevs(length,-1);
        priority_queue<pair<double,int>> distsHeap;
        distsHeap.emplace(1,startNode);
        while(!distsHeap.empty()){
            auto item=distsHeap.top();
            double dist=item.first;
            int node=item.second;
            distsHeap.pop();
            if(dist<dists[node]){
                continue;
            }
            for(int i=0;i<graph[node].size();++i){
                auto item1=graph[node][i];
                double edgeWeight=item1.first;
                int subNode=item1.second;
                double thisDist=edgeWeight*dists[node];
                if(thisDist>dists[subNode]){
                    dists[subNode]=thisDist;
                    // pathsPrevs[subNode]=node;
                    distsHeap.emplace(thisDist,subNode);
                }
            }
        }
        return dists;
    }

    double maxProbability(int n, vector<vector<int>>& edges, vector<double>& succProb, int start_node, int end_node) {
        vector<vector<pair<double,int>>> graph(n);
        for(int i=0;i<edges.size();++i){
            auto& edge = edges[i];
            graph[edge[0]].emplace_back(succProb[i],edge[1]);
            graph[edge[1]].emplace_back(succProb[i],edge[0]);
        }
        // for(auto i:graph){
        //     for(auto j:i){
        //         cout << j.first << " " << j.second << endl;
        //     }
        //     cout << endl;
        // }
        vector<double> probs=dijkstraMaxDist(graph,start_node);
        return probs[end_node];
    }
};

4.执行结果

在这里插入图片描述

标签:node,startNode,int,graph,路径,distsHeap,1514,Leetcode
From: https://www.cnblogs.com/geek0070/p/18472316

相关文章

  • Leetcode 802. 找到最终的安全状态
    1.题目基本信息1.1.题目描述有一个有n个节点的有向图,节点按0到n–1编号。图由一个索引从0开始的2D整数数组graph表示,graph[i]是与节点i相邻的节点的整数数组,这意味着从节点i到graph[i]中的每个节点都有一条边。如果一个节点没有连出的有向边,则该节点是终......
  • 免费插件集-illustrator插件-Ai插件-剪切路径
    文章目录1.介绍2.安装3.通过窗口>扩展>知了插件4.功能解释5.总结1.介绍本文介绍一款免费插件,加强illustrator使用人员工作效率,实现多路径集合路径剪切功能。首先从下载网址下载这款插件https://download.csdn.net/download/m0_67316550/87890501,或者http://www.zhi......
  • LeetCode第六题:锯齿形转换(Python)
    一.题目要求及实例将给定的字符串,转化为锯齿形。锯齿形的行数给定。按序输出转换后的字符串。二.初始思路(1)二维数组的大小竖着写入二维数组较困难,所以想到了先横着写,再取转置。首先需要知道二维数组的大小。参数中给的numRows即为行数,所以要考虑的就是二维数组的列数。......
  • 常见问题——C#未能找到路径“\bin\roslyn\csc.exe”的一部分
    1.主要原因是因为两个库存在,需要生成一个roslyn文件那么就删除这两个关联的库,就可以达到目的删去项目中的这两天引用:Microsoft.CodeDom.Providers.DotNetCompilerPlatformMicrosoft.Net.Compilers2.删除web.config中加载的这个依赖的代码段<system.codedom><compilers......
  • LeetCode 1884.鸡蛋掉落-两枚鸡蛋:动态规划
    【LetMeFly】1884.鸡蛋掉落-两枚鸡蛋:动态规划力扣题目链接:https://leetcode.cn/problems/egg-drop-with-2-eggs-and-n-floors/给你2 枚相同的鸡蛋,和一栋从第1 层到第n层共有n层楼的建筑。已知存在楼层f,满足 0<=f<=n,任何从高于f的楼层落下的鸡蛋都会......
  • 路径规划——RRT、RRT*、RRT-Connect算法说明
    1.RRT伪代码RRT的目标是在状态空间中随机采样并扩展树结构,直到找到连接起点和终点的路径。RRT(Rapidly-exploringRandomTree,快速随机扩展树)是一种用于解决运动规划问题的采样算法。它通过随机采样的方式,逐步构建一棵树,直到找到一条从起始状态到目标状态的路径。RRT算法的......
  • leetcode算法题 437.路径总和
    题目描述给定一个二叉树的根节点 root ,和一个整数 targetSum ,求该二叉树里节点值之和等于 targetSum 的 路径 的数目。路径 不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。 示例示例1:输入:root=[10,5,-3,3,2,null,1......
  • <Leetcode:算法题及解析>最大子数组和(Javascript版)
    题目描述:给你一个整数数组nums,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。子数组是数组中的一个连续部分。本题可以使用Kadane's算法实现,这是一种用于解决最大子数组和问题的高效算法。它由JosephBornKadane在1984年提出。这个算法的核......
  • PowerShell 实现删除指定路径X天前文件功能并添加定时JOB实例
    公司的POA服务器的E盘隔三差五就爆满,原因是数据库备份文件越来越大,现在已经大到需要高频清理的地步了十一前出现的这个问题,当时为了不专门在假期里某天特地去清理磁盘,想着一定要搞个定时JOB实现自动清理最后选用了PowerShell脚本实现新建一个txt文件,打开编辑内容如下:#设置要......
  • 迭代式开发:提升软件项目管理效率的关键路径
    一、迭代式开发的核心理念要理解迭代式开发(IterativeDevelopment),首先要明白它与传统的开发方法有何不同。迭代式开发的核心思想是将软件开发过程分解为一系列小的、可管理的周期,称为“迭代”。每个迭代通常持续几周,结束时会交付一个可运行的产品版本,尽管这个版本可能并不完整,但它......