LeetCode 1786. 从第一个节点出发到最后一个节点的受限路径数(迪杰斯特拉 + 拓扑排序)

文章目录

    • 1. 题目
    • 2. 解题

1. 题目

现有一个加权无向连通图。
给你一个正整数 n ,表示图中有 n 个节点,并按从 1 到 n 给节点编号;另给你一个数组 edges ,其中每个 edges[i] = [ui, vi, weighti] 表示存在一条位于节点 ui 和 vi 之间的边,这条边的权重为 weighti 。

从节点 start 出发到节点 end 的路径是一个形如 [z0, z1, z2, ..., zk] 的节点序列,满足 z0 = start 、zk = end 且在所有符合 0 <= i <= k-1 的节点 zi 和 zi+1 之间存在一条边。

路径的距离定义为这条路径上所有边的权重总和。
distanceToLastNode(x) 表示节点 nx 之间路径的最短距离
受限路径 为满足 distanceToLastNode(zi) > distanceToLastNode(zi+1) 的一条路径,其中 0 <= i <= k-1 。

返回从节点 1 出发到节点 n 的 受限路径数
由于数字可能很大,请返回对 10^9 + 7 取余 的结果。

示例 1:

输入:n = 5, 
edges = [[1,2,3],[1,3,3],[2,3,1],[1,4,2],[5,2,2],[3,5,1],[5,4,10]]
输出:3
解释:每个圆包含黑色的节点编号和蓝色的 distanceToLastNode 值。
三条受限路径分别是:
1) 1 --> 2 --> 5
2) 1 --> 2 --> 3 --> 5
3) 1 --> 3 --> 5

示例 2:

输入:n = 7, 
edges = [[1,3,1],[4,1,2],[7,3,4],[2,5,3],[5,6,1],[6,7,2],[7,5,3],[2,6,4]]
输出:1
解释:每个圆包含黑色的节点编号和蓝色的 distanceToLastNode 值。
唯一一条受限路径是:1 --> 3 --> 7 。提示:
1 <= n <= 2 * 10^4
n - 1 <= edges.length <= 4 * 10^4
edges[i].length == 3
1 <= ui, vi <= n
ui != vi
1 <= weighti <= 10^5
任意两个节点之间至多存在一条边
任意两个节点之间至少存在一条路径

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/number-of-restricted-paths-from-first-to-last-node
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

  • 先预处理出每个点 到 n 点 的最短路径,参考迪杰斯特拉算法
  • 再建立 1 开始的最短路径是递减的 新图,同时记录节点的入度
  • 采用 拓扑排序,累积前一个节点转移过来的方案数
typedef pair<int, int> pii;
struct cmp{bool operator()(pii& a, pii& b) const{return a.first > b.first;}
};
class Solution {
public:int countRestrictedPaths(int n, vector<vector<int>>& edges) {// 建图,迪杰斯特拉 求解 每个节点到 n 的最短距离 disvector<unordered_map<int,int>> g(n);for(auto & e : edges){g[e[0]-1][e[1]-1] = e[2];g[e[1]-1][e[0]-1] = e[2];}vector<int> dis(n, INT_MAX);priority_queue<pii, vector<pii>, cmp> q;dis[n-1] = 0;q.push({0, n-1});while(!q.empty()){pii tp = q.top();int d = tp.first;int id = tp.second;q.pop();for(auto it = g[id].begin(); it != g[id].end(); ++it){int nid = it->first;int nd = it->second;if(d + nd < dis[nid]){dis[nid] = d + nd;q.push({dis[nid], nid});}}}// 建立 从 1 节点开始的 dis 递减图,并记录入度vector<int> indegree(n, 0);unordered_map<int,unordered_set<int>> g2;queue<int> q1;q1.push(0);unordered_set<int> vis;vis.insert(0);while(!q1.empty()){int id = q1.front();q1.pop();for(auto it = g[id].begin(); it != g[id].end(); ++it){int nid = it->first;if(dis[id] > dis[nid])//递减{g2[id].insert(nid);//建图indegree[nid]++;//记录出入度if(!vis.count(nid))//防止重复记录入度{vis.insert(nid);q1.push(nid);}}}}// 拓扑排序long long mod = 1e9+7;vector<long long> ans(n, 0);ans[0] = 1;queue<int> q2;q2.push(0);while(!q2.empty()){int id = q2.front();q2.pop();for(auto it = g2[id].begin(); it != g2[id].end(); ++it){int nid = *it;ans[nid] = (ans[nid] + ans[id])%mod;if(--indegree[nid] == 0)q2.push(nid);}}return ans[n-1]%mod;}
};

676 ms 174 MB C++


我的CSDN博客地址 https://michael.blog.csdn.net/

长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!
Michael阿明

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java选择题多选题系统小程序_单选题与多选题判断得分(自动考试小程序,入门级)...

【单选题与多选题判断得分】【核心代码】using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows.Forms;namespace 自动…

diskfileitemfactory 需要的包_浅析电动汽车电池包低压线束设计及制造

点击上方右侧“EDC电驱未来”可订阅哦&#xff01;般的电池包低压线束承载着模组通信、模组采样和电池管理等功能。电池包低压线束一般分为模组通信线束、模组采样线束、BMS线束等。这里结合实际工作中的经历和遇到的困扰&#xff0c;主要分析和探讨SUV纯电动汽车电池包低压线束…

xgboost实例_XGBoost超详细推导,终于有人讲明白了!

- XGB中树结点分裂的依据是什么&#xff1f;- 如何计算树节点的权值&#xff1f;- 为防止过拟合&#xff0c;XGB做了哪些改进&#xff1f;相信看到这篇文章的各位对XGBoost都不陌生&#xff0c;的确&#xff0c;XGBoost不仅是各大数据科学比赛的必杀武器&#xff0c;在实际工作…

修改dts后重编译_「正点原子FPGA连载」第二十章另一种方式编译ZYNQ镜像

1)摘自【正点原子】领航者 ZYNQ 之linux驱动开发指南2)实验平台&#xff1a;正点原子领航者ZYNQ开发板3)平台购买地址&#xff1a;https://item.taobao.com/item.htm?&id6061601087614)全套实验源码手册视频下载:http://www.openedv.com/docs/boards/fpga/zdyz_linhanz.ht…

流畅的Python 2. 数据结构 - 序列构成的数组

文章目录1. 内置序列2. 列表推导 []、生成器() 表达式3. 元组 tuple4. 切片5. , * 操作6. 增量赋值7. 排序8. bisect管理已排序序列8.1 用 bisect.bisect 二分搜索8.2 用 bisect.insort 二分插入新元素9. 列表的替代9.1 数组9.2 内存视图9.3 NumPy、SciPy9.4 队列1. 内置序列 …

hadoop 多机全分布式安装步骤(虚拟机1master+2slave)

文章目录1. 虚拟机安装Centos72. 配置静态IP3. 更改主机名4. 编辑域名映射5. 安装配置Java6. 配置SSH免密登录7 .安装Hadoop8. 关闭防火墙9. 格式化文件系统10. 启动验证11. 第一个MapReduce程序: WordCount12. 关闭Hadoop参考书&#xff1a;《Hadoop大数据原理与应用》1. 虚拟…

ie浏览器模拟器_航空飞机模拟器安卓版下载-航空飞机模拟器游戏下载

3D建模射击&#xff0c;真实的飞行世界&#xff0c;在航空飞机模拟器游戏中玩家将化身为飞行员&#xff0c;这里的飞机类型非常齐全&#xff0c;每一辆都要熟练操作&#xff0c;最大程度还原了飞行员最真实的驾驶场景&#xff0c;完成任务获得奖励还能提高它的性能哦&#xff0…

npm安装vue_vue搭建脚手架的方式

基于window系统整理的vue脚手架npm、yarn安装方法&#xff0c;记得网络一定要好先说npm的安装方法先在需要创建项目的文件夹下打开终端&#xff0c;如果没有node可以先去官网下载&#xff0c;然后一路next&#xff0c;就OK&#xff0c;记得看清楚电脑操作系统是64还是32&#x…

《BI那点儿事》运用标准计分和离差——分析三国超一流统帅综合实力排名 绝对客观,数据说话...

数据分析基础概念&#xff1a;标准计分&#xff1a; 1、无论作为变量的满分为几分&#xff0c;其标准计分的平均数势必为0&#xff0c;而其标准差势必为1。2、无论作为变量的单位是什么&#xff0c;其标准计分的平均数势必为0&#xff0c;而其标准差势必为1。公式为&#xff1a…

天池 在线编程 最佳利用率(二分查找 + 哈希)

文章目录1. 题目2. 解题1. 题目 给两个排序的数组。 从两个数组中各取取一个数&#xff0c;这两个数之和需要小于或等于k&#xff0c; 需要找到两数之和最大的索引组合。 返回一对包含两个列表的索引。 如果有多个两数之和相等的索引答案&#xff0c;你应该选择第一个数组索引…

python re 匹配多行_Python正则表达式,看这一篇就够了

作者 | 猪哥来源 | 裸睡的猪(ID: IT--Pig)大多数编程语言的正则表达式设计都师从Perl&#xff0c;所以语法基本相似&#xff0c;不同的是每种语言都有自己的函数去支持正则&#xff0c;今天我们就来学习 Python中关于 正则表达式的函数。re模块主要定义了9个常量、12个函数、1个…

nsga2算法_用遗传算法进行容量管理 让虚拟机放置策略更优

随着互联网技术的高速发展&#xff0c;云计算已经成为各行各业的“水电煤”&#xff0c;成为“互联网”的基础设施&#xff0c;而数据中心则是云服务背后的刚性保障。无论是传统的数据中心&#xff0c;还是云形态的数据中心&#xff0c;虚拟化技术都是提升其资源利用率、降低管…

php预处理_如何用预处理让 PHP 更先进

原标题&#xff1a;如何用预处理让 PHP 更先进先来点趣事。不久以前&#xff0c; 来添加 Python 的 range 语法。然后&#xff0c; 大虾 &#xff0c;并且 建议为 PHP 添加 C# 风格的 getter 和 setter。我意识到对于一个局外人来说&#xff0c;建议和实现新的语言特性是件缓慢…

天池 在线编程 两句话中的不常见单词(哈希计数)

文章目录1. 题目2. 解题1. 题目 给定两个句子 A 和 B 。 &#xff08;句子是一串由空格分隔的单词。每个单词仅由小写字母组成。&#xff09; 如果一个单词在其中一个句子中只出现一次&#xff0c;在另一个句子中却没有出现&#xff0c;那么这个单词就是不常见的。 返回所有…

iphone屏幕上的圆圈怎么设置_iPhone手机屏幕突然变暗或者黑屏怎么办?看这里你就知道该怎么办...

阅读本文前&#xff0c;请您先点击上面的蓝色字体&#xff0c;再点击“关注”&#xff0c;这样您就可以继续免费收到各种有关娱乐的文章了。每天都有分享&#xff0c;完全是免费订阅&#xff0c;请放心关注。 …

C语言库函数大全及应用实例六

C语言库函数大全及应用实例六 原文:C语言库函数大全及应用实例六[编程资料]C语言库函数大全及应用实例六函数名: getlinesettings 功 能: 取当前线型、模式和宽度 用 法: void far getlinesettings(struct linesettingstype far *lininfo): 程序例: <?xml:namespace prefix…

天池 在线编程 最小的行程(动态规划)

文章目录1. 题目2. 解题1. 题目 给定一个二维矩阵&#xff0c;找到从上到下的最小路径。只能向左下&#xff0c;下&#xff0c;右下移动 所有的元素都是正整数 矩阵大小 < 200x200 样例 1: 输入: 1 2 3 4 5 6 7 8 9 输出: 12 解释: 最短的路径为:1->4->7, 返回12.样…

fluent瞬态计算终止条件在哪里设置_Fluent案例7【圆柱绕流】

一个瞬态的圆柱绕流案例知识点&#xff1a;瞬态圆柱绕流的模拟一个后处理的方法&#xff1a;将瞬态模型中一个点的速度变化绘成图表并将数值导出excel文件模型如下图所示&#xff0c;左边界为速度边界进口速度0.5m/s&#xff0c;试模拟出计算域中的速度变化打开workbench&#…

qq登录界面句柄_别小看QQ邮箱测试,80%的测试新手都不能写出完整的测试用例~...

对于很多刚进入测试行业的新手来说&#xff0c;由于自身的工作经验不足&#xff0c;虽有测试基础知识傍身&#xff0c;但仍然很难将测试用例写的尽善尽美。因此&#xff0c;学习别人的测试经验&#xff0c;将是你成为测试达人的必经之路。今天&#xff0c;我们就以QQ邮箱为例&a…

LeetCode 878. 第 N 个神奇数字(二分查找)

文章目录1. 题目2. 解题1. 题目 如果正整数可以被 A 或 B 整除&#xff0c;那么它是神奇的。 返回第 N 个神奇数字。由于答案可能非常大&#xff0c;返回它模 10^9 7 的结果。 示例 1&#xff1a; 输入&#xff1a;N 1, A 2, B 3 输出&#xff1a;2示例 2&#xff1a; 输…