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)
表示节点 n
和 x
之间路径的最短距离。
受限路径 为满足 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阿明),一起加油、一起学习进步!
LeetCode 1786. 从第一个节点出发到最后一个节点的受限路径数(迪杰斯特拉 + 拓扑排序)相关推荐
- LeetCode 第 59 场力扣夜喵双周赛(最短路径数+迪杰斯特拉、动态规划+最长公共前缀问题) / 第255场周赛(二进制转换,分组背包,子集还原数组(脑筋急转弯))
第 59 场力扣夜喵双周赛 两道400多五百,后两道都写出代码来了,但是都有问题,哭辽- 还有刚开始第一道测试好慢,搞心态了 5834. 使用特殊打字机键入单词的最少时间 有一个特殊打字机,它由一个 ...
- LeetCode 1976. 到达目的地的方案数(迪杰斯特拉 Python 优先队列)
文章目录 1. 题目 2. 解题 1. 题目 你在一个城市里,城市由 n 个路口组成,路口编号为 0 到 n - 1 ,某些路口之间有 双向 道路. 输入保证你可以从任意路口出发到达其他任意路口,且任 ...
- 第一届中兴捧月算法大赛迪杰斯特拉派解决方案
迪杰斯特拉派初赛赛题 最强大脑中的收官蜂巢迷宫变态级挑战,相信大家都叹为观止!最强大脑收官战打响后,收视率节节攀升,就连蚁后也不时出题难为一下她的子民们.在动物世界中,称得上活地图的,除了蜜蜂,蚂蚁当 ...
- 迪杰斯特拉(Dijsktra)算法求到任意节点的最短路径
迪杰斯特拉算法要求 1.必须给一个起点,求出起点到任何节点的最短路径,如果不可达那么距离设定为正无穷 2.输出一张表记录一个节点到任何节点的最短路径 3.dijkstra本质是一种贪心算法 要求: 不 ...
- rac一节点时间比另一个节点快_数据库数据那么多为什么可以检索这么快?
你好,是我琉忆. 经常跟数据打交道的你,有没有去考虑过数据上百万,为什么它可以检索那么快? 一说到数据库的检索速度这么快,我想你一定想到了索引. 没错,今天我们来简单聊聊索引,聊聊索引是什么,怎么使用 ...
- oracle rac节点重启,oracle RAC一个节点频繁重启解决
oracle RAC一个节点频繁重启解决 类别:Oracle数据库 作者:码皇 来源:hijk139的专栏 点击: oracle RAC一个节点频繁重启解决故障现象:2011年的一次问 ...
- LeetCode LCP 56. 信物传送(迪杰斯特拉-最短路径)
文章目录 1. 题目 2. 解题 1. 题目 欢迎各位勇者来到力扣城,本次试炼主题为「信物传送」. 本次试炼场地设有若干传送带,matrix[i][j] 表示第 i 行 j 列的传送带运作方向,&qu ...
- activiti根据当前节点获取下一个节点信息
在流程中使用监听器判断当前节点是否需要经过,否则跳转到下一个节点,如下图 当提交申请之后,当前提交人为部门负责人,那么部门负责人节点就不需要走了,直接到下一个节点,但是下一个节点是什么并不知道,就可以 ...
- 每天一道LeetCode-----为二叉树增加next节点,指向同一层的下一个节点
Populating Next Right Pointers in Each Node 原题链接Populating Next Right Pointers in Each Node 将完全二叉树每个 ...
最新文章
- Codeforces Round #742 (Div. 2) E. Non-Decreasing Dilemma (线段树维护区间连续问题)
- 简单明了!OLTP场景下的数据分布式设计原则
- org.apache.ibatis.binding.BindingException: Parameter 'username' not found. Available parameters
- 【Python】学习笔记总结9(数据库与Python交互)
- Java程序利用POJ读写Excel的.xls或.xlsx文件所需的3个jar包
- 【朝夕技术专刊】Core3.1WebApi_Filter-Authorize详解
- 数据可视化 信息可视化_可视化数据以帮助清理数据
- 解决Pycharm添加虚拟解释器的报错问题
- 【SQLServer】将Job运行结果发送电子邮件通知用户
- 阶段1 语言基础+高级_1-3-Java语言高级_08-JDK8新特性_第1节 常用函数接口_2_函数式接口的使用...
- LiveReload的下载安装 + Sublime的配置
- 学生计算机编程比赛获奖感言,学生技能大赛获奖感言
- C语言库函数:memcmp/strcmp和strncmp的区别
- 控制WINDOWS,使电脑说话的小玩意
- CentOS Firefox播放视频--安装Flash插件
- python可视化是什么意思_python3数据可视化是什么?
- ❤️Hello Programmer❤️
- 计算机安全模式启动时蓝屏,win7安全模式也蓝屏怎么办_win7安全模式蓝屏怎么解决...
- 遥感监测草原产草量的方法
- Xilinx Zynq开发教程
热门文章
- 机器学习算法之 logistic、Softmax 回归
- ubuntu系统下Java环境JDK的安装
- 解决Ubuntu中文件管理器死掉的情况
- 【linux】Ubuntu 18.04 设置桌面快捷启动方式
- 大学c语言程序设计大赛,关于举办宁夏大学第二届C语言程序设计大赛的通知
- mysql mtop_mysqlmtop2.2运行出错
- 使用BusyBox制作根文件系统的理论分析
- 【java设计模式】【行为模式Behavioral Pattern】迭代器模式Iterator Pattern
- 终端mysql Operation not permitted错误解决方案
- Spring中DispacherServlet、WebApplicationContext、ServletContext的关系