【算法】最短路问题 bfs 到 dijkstra

1976、到达目的地的方案数

你在一个城市里,城市由 n 个路口组成,路口编号为 0 到 n - 1 ,某些路口之间有 双向 道路。输入保证你可以从任意路口出发到达其他任意路口,且任意两个路口之间最多有一条路。

给你一个整数 n 和二维整数数组 roads ,其中 roads[i] = [ui, vi, timei] 表示在路口 ui 和 vi 之间有一条需要花费 timei 时间才能通过的道路。你想知道花费 最少时间 从路口 0 出发到达路口 n - 1 的方案数。

请返回花费 最少时间 到达目的地的 路径数目 。由于答案可能很大,将结果对 109 + 7 取余 后返回。

题目解析

本题要求用最少时间到达n-1的路径数目,所以有两个目标:找到最短用时路径、找到最短路径的所有数目。

关于找到最短路径,有很多种方式都可以找到,例如bfs、dijkstra。

而找路径数目,用到了动态规划的思想

假设v是从u点过来的
w a y s ( v ) = { w a y s [ u ] if 找到了一条新最短路 w a y s [ u ] + w a y s [ v ] if 距离相等则在原来的方案上加 ways(v) = \begin{cases} ways[u] & \text{if } 找到了一条新最短路 \\ ways[u] + ways[v] & \text{if } 距离相等则在原来的方案上加 \end{cases} ways(v)={ways[u]ways[u]+ways[v]if 找到了一条新最短路if 距离相等则在原来的方案上加

经验

在这样的设计中,我遇到了很多特别难以理解的问题:

存图

要保证双向的输入,一开始我的想法是只让小的节点指向大的节点,但后来发现:
在这里插入图片描述
仍然有可能是先到4再到3,所以要把两个指向都加入进去。

必须使用priority_queue

为什么?因为是普通的queue,本质上是基于bfs来进行的搜索。而使用priority_queue的算法是dijkstra算法,这道题目不能用bfs最短路来求,

ways[u] + ways[v] 注意到这个递推公式,如果我们把 ways[v] 更新后,将这个节点后面的ways加上了ways[v] , 但后来又找到了v的一条等长最短路,导致ways[v]更新了,但他后面的节点没有更新。

如果是dijkstra算法,可以保证不会出现上面bfs的问题,因为他会按照时间排序,即保证 在将这个节点后面的ways加上了ways[v] 之后,不会找到等长或更小的最短路径的了,也就不会导致后面的节点不会更新。

参考代码

class Solution {
public:using LL = long long;const LL mod = 1e9+7;int countPaths(int n, vector<vector<int>>& roads) {vector<vector<pair<int,int>>> e(n);for(auto& road : roads){int x = road[0], y = road[1] , t = road[2];e[x].push_back({y,t});e[y].push_back({x,t});}vector<LL> dis(n, LLONG_MAX);//表示源到i点的最短距离vector<LL> ways(n);//表示源到点的最短的路径的数目//路径的长度,点的编号priority_queue<pair<LL,int>,vector<pair<LL,int>>, greater<pair<LL,int>>> q;q.emplace(0,0);dis[0] = 0;ways[0] = 1;while(!q.empty()){auto [t,u] = q.top();q.pop();for(auto& [v,w] : e[u]){if(t+w < dis[v]){cout << dis[v]<<endl;dis[v] = t+w;ways[v] = ways[u];q.push({dis[v] , v});}else if(t+w == dis[v]){ways[v] = (ways[u] + ways[v]) % mod;}}}return ways[n-1];}
};

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

laravel8 导入 excel常见问题

上传xls 或 xlsx 文件后&#xff0c;文件解析为 zip 格式&#xff0c;输入正常情况&#xff0c;不影响解析 里面的内容 遇到解析内容&#xff0c;解析为空的情况&#xff0c;可能是 因为excel 存在多个 Sheet1 造成&#xff0c;服务器不能解析一个 Sheet1 的情况&#xff0…

小程序获取手机号,用户昵称,头像

一、手机号 在微信小程序中&#xff0c;获取用户手机号也需要用户的明确授权。你可以使用 button 组件的 open-type 属性设置为 getPhoneNumber 来实现这个功能。当用户点击这个按钮时&#xff0c;会弹出一个对话框请求用户的授权。如果用户同意&#xff0c;你可以在 bindgetp…

如何通过优质服务建立客户忠诚度,促进口碑传播

在生活中&#xff0c;我们经常听到“客户忠诚度”一词&#xff0c;但很少有人真正理解客户忠诚度的含义。其实&#xff0c;客户忠诚度是指企业忠实于其所提供的产品或服务的程度&#xff0c;客户忠诚度对企业和个人都非常重要。高忠诚度的客户会给企业带来巨大的经济和社会效益…

VMware虚拟机故障:“显示指定的文件不是虚拟磁盘“,处理办法

一、故障现象 由于虚拟机宕机&#xff0c;强制重新启动虚拟机后显示错误&#xff0c;没有办法启动虚拟机。 虚拟机有快照&#xff0c;执行快照还原&#xff0c;结果也不行&#xff0c;反复操作&#xff0c;在虚拟机文件目录出现很多莫名文件 二、故障原因 根据故障提示&#…

Swift 初学者趣谈:一招教你记住模式匹配 if case let 的语法,永不忘记

概览 相信初学 Swift 头发茂盛的小伙伴们都对 Swift 简洁且极富表现力的语法倾心不已。不过凡事皆有例外&#xff0c;模式匹配&#xff08;Pattern Matching&#xff09;的语法就是其中之一。 在本篇博文中&#xff0c;您将学到如下内容 概览1. 诡异的 if case let 语法&…

代码随想录算法训练营第二十五天 | 669. 修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树

669. 修剪二叉搜索树 题目链接/文章讲解&#xff1a; 代码随想录 视频讲解&#xff1a; 你修剪的方式不对&#xff0c;我来给你纠正一下&#xff01;| LeetCode&#xff1a;669. 修剪二叉搜索树_哔哩哔哩_bilibili 解题思路 在上一题的删除二叉树节点中&#xff0c;我们通过在…

python实现星号打印出金字塔

#编程实现下列图形的打印 a input() for i in range(int(a)//21): num * * ((i1)*2-1) print(num.center(int(a), )) 编译后通过。输入20后得到下面的星号金字塔

麒麟kylin-v10系统,虚拟机kvm的使用

kvm的使用 虚拟机新建 点击选择对应的iso文件 选择相应的系统 &#xff08;注意&#xff0c;如果这里没有相应的系统比如&#xff1a;windows&#xff0c;可以直接选择Generic default这是通用默认的意思&#xff09; 选择cpu 完成即可 等待安装完毕 网络设置-ssh连接 虚拟…

在 Navicat 17 创建一个数据字典

即将于 5 月 13 日发布的 Navicat 17&#xff08;英文版&#xff09;添加了许多令人兴奋的新功能。其中之一就是数据字典工具。它使用一系列 GUI 指导你完成创建专业质量文档的过程&#xff0c;该文档为跨多个服务器平台的数据库中的每个数据元素提供描述。在今天的博客中&…

企业网络需求及适合的解决方案

近年来&#xff0c;企业网络通信需求可谓五花八门&#xff0c;变幻莫测。它不仅为企业的生产、办公、研发、销售提供全面赋能&#xff0c;同时也让企业业务规模变大成为了可能。 在当前的技术格局下&#xff0c;中大型企业常见的技术方案有很多&#xff0c;而同时也有各自不可替…

docker部署minio和业务服务因变更minio密码导致访问不到图片的问题

问题起因 业务application和minio都是docker部署。按部署规则minio的环境变量中设置了MINIO_ROOT_USER和MINIO_ROOT_PASSWORD。这样就可以用这套用户名密码登录minio了。而我的application中是通过api访问minio获取资源URL&#xff0c;提供给前端的。所以在application的环境变…

4种最佳后端开发语言(2024版本)

本文发表于 入职啦 公众号。 什么是后端语言&#xff1f; 在开发方面&#xff0c;前端和后端技术之间有非常明显的区别。 Web开发方面虽然由于浏览器兼容性&#xff0c;前端生态系统仅限于 JavaScript&#xff08;和其他基于 JavaScript 的语言&#xff0c;如 TypeScript&…

C++笔试强训day17

目录 1.小乐乐改数字 2.十字爆破 3.比那名居的桃子 1.小乐乐改数字 链接 简单把他当成字符串遍历即可。 详细代码&#xff1a; #include <iostream> #include <string> using namespace std; int main() {string s;cin >> s;for (int i 0; i < s.si…

MySQL innodb_buffer_pool_size 相关常用语句

对于MySQL速度慢的问题&#xff0c;除了优化 SQL 以外&#xff0c;应该必须优先想到的即使 MySQL 数据库的 innodb_buffer_pool_size 配置问题。 一般来说&#xff0c;innodb_buffer_pool_size 的默认大小都是很小的&#xff0c;尤其是 win 下其默认大小更是只有离谱的 8M。Li…

1-2亿条数据需要缓存,如何合理设计存储

单机是不可能的&#xff0c;肯定是分布式存储 数据怎么落&#xff1f; 一般业界有三种解决方案 哈希取余分区 一致性哈希算法分区 哈希槽分区&#xff08;大厂专用&#xff0c;都在用&#xff09;最终的选择

地下工程中测斜仪的关键应用

地下工程&#xff0c;如隧道、地铁和基坑等项目的建设&#xff0c;对于现代城市的发展至关重要。然而&#xff0c;这些工程的实施往往伴随着诸多风险&#xff0c;特别是与周围土体的稳定性有关的风险。为了确保工程的安全进行&#xff0c;实时监测技术变得尤为关键。其中&#…

Ubuntu18.04--虚拟机配置Samba并从Windows登录

前言&#xff1a; 本文记录我自己在Windows上安装 Virtualbox &#xff0c;并在Virtualbox中安装 Ubuntu-18.04 虚拟机&#xff0c;在Ubuntu-18.04虚拟机里安装配置Smaba服务器&#xff0c;从 Windows 宿主系统上访问虚拟机共享samba目录的配置命令。 引用: N/A 正文 虚拟…

【计算机网络】物理层 通信基础、奈氏准则、香农公式 习题2

下列说法中正确的是( )。 A. 信道与通信电路类似&#xff0c;一条可通信的电路往往包含一个信道 B.调制是指把模拟数据转换为数字信号的过程 C. 信息传输速率是指通信信道上每秒传输的码元数 D.在数值上&#xff0c;波特率等于比特率与每符号所含的比特数的比值 信息传输速率&a…

分享5个免费AI写作软件

在数字化时代&#xff0c;人工智能&#xff08;AI&#xff09;正以惊人的速度渗透到我们生活的方方面面&#xff0c;而写作领域也不例外。AI写作工具的出现&#xff0c;不仅改变了传统的写作流程&#xff0c;更在创意表达、文本生成、语言校正等方面展现了其独特的优势。这些工…

测斜仪的具体应用:从地下工程到斜坡监测

测斜仪作为一种精密的测量工具&#xff0c;在多个领域都有广泛的应用。从最初的地下工程&#xff0c;到现今的斜坡监测&#xff0c;测斜仪的技术进步和应用范围的扩大&#xff0c;为工程安全提供了有力的保障。 一、地下工程中的测斜仪应用 在地下工程中&#xff0c;测斜仪主要…