文章目录

  • 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阿明),一起加油、一起学习进步!

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

  1. LeetCode 第 59 场力扣夜喵双周赛(最短路径数+迪杰斯特拉、动态规划+最长公共前缀问题) / 第255场周赛(二进制转换,分组背包,子集还原数组(脑筋急转弯))

    第 59 场力扣夜喵双周赛 两道400多五百,后两道都写出代码来了,但是都有问题,哭辽- 还有刚开始第一道测试好慢,搞心态了 5834. 使用特殊打字机键入单词的最少时间 有一个特殊打字机,它由一个 ...

  2. LeetCode 1976. 到达目的地的方案数(迪杰斯特拉 Python 优先队列)

    文章目录 1. 题目 2. 解题 1. 题目 你在一个城市里,城市由 n 个路口组成,路口编号为 0 到 n - 1 ,某些路口之间有 双向 道路. 输入保证你可以从任意路口出发到达其他任意路口,且任 ...

  3. 第一届中兴捧月算法大赛迪杰斯特拉派解决方案

    迪杰斯特拉派初赛赛题 最强大脑中的收官蜂巢迷宫变态级挑战,相信大家都叹为观止!最强大脑收官战打响后,收视率节节攀升,就连蚁后也不时出题难为一下她的子民们.在动物世界中,称得上活地图的,除了蜜蜂,蚂蚁当 ...

  4. 迪杰斯特拉(Dijsktra)算法求到任意节点的最短路径

    迪杰斯特拉算法要求 1.必须给一个起点,求出起点到任何节点的最短路径,如果不可达那么距离设定为正无穷 2.输出一张表记录一个节点到任何节点的最短路径 3.dijkstra本质是一种贪心算法 要求: 不 ...

  5. rac一节点时间比另一个节点快_数据库数据那么多为什么可以检索这么快?

    你好,是我琉忆. 经常跟数据打交道的你,有没有去考虑过数据上百万,为什么它可以检索那么快? 一说到数据库的检索速度这么快,我想你一定想到了索引. 没错,今天我们来简单聊聊索引,聊聊索引是什么,怎么使用 ...

  6. oracle rac节点重启,oracle RAC一个节点频繁重启解决

    oracle RAC一个节点频繁重启解决 类别:Oracle数据库   作者:码皇   来源:hijk139的专栏     点击: oracle RAC一个节点频繁重启解决故障现象:2011年的一次问 ...

  7. LeetCode LCP 56. 信物传送(迪杰斯特拉-最短路径)

    文章目录 1. 题目 2. 解题 1. 题目 欢迎各位勇者来到力扣城,本次试炼主题为「信物传送」. 本次试炼场地设有若干传送带,matrix[i][j] 表示第 i 行 j 列的传送带运作方向,&qu ...

  8. activiti根据当前节点获取下一个节点信息

    在流程中使用监听器判断当前节点是否需要经过,否则跳转到下一个节点,如下图 当提交申请之后,当前提交人为部门负责人,那么部门负责人节点就不需要走了,直接到下一个节点,但是下一个节点是什么并不知道,就可以 ...

  9. 每天一道LeetCode-----为二叉树增加next节点,指向同一层的下一个节点

    Populating Next Right Pointers in Each Node 原题链接Populating Next Right Pointers in Each Node 将完全二叉树每个 ...

最新文章

  1. Codeforces Round #742 (Div. 2) E. Non-Decreasing Dilemma (线段树维护区间连续问题)
  2. 简单明了!OLTP场景下的数据分布式设计原则
  3. org.apache.ibatis.binding.BindingException: Parameter 'username' not found. Available parameters
  4. 【Python】学习笔记总结9(数据库与Python交互)
  5. Java程序利用POJ读写Excel的.xls或.xlsx文件所需的3个jar包
  6. 【朝夕技术专刊】Core3.1WebApi_Filter-Authorize详解
  7. 数据可视化 信息可视化_可视化数据以帮助清理数据
  8. 解决Pycharm添加虚拟解释器的报错问题
  9. 【SQLServer】将Job运行结果发送电子邮件通知用户
  10. 阶段1 语言基础+高级_1-3-Java语言高级_08-JDK8新特性_第1节 常用函数接口_2_函数式接口的使用...
  11. LiveReload的下载安装 + Sublime的配置
  12. 学生计算机编程比赛获奖感言,学生技能大赛获奖感言
  13. C语言库函数:memcmp/strcmp和strncmp的区别
  14. 控制WINDOWS,使电脑说话的小玩意
  15. CentOS Firefox播放视频--安装Flash插件
  16. python可视化是什么意思_python3数据可视化是什么?
  17. ❤️Hello Programmer❤️
  18. 计算机安全模式启动时蓝屏,win7安全模式也蓝屏怎么办_win7安全模式蓝屏怎么解决...
  19. 遥感监测草原产草量的方法
  20. Xilinx Zynq开发教程

热门文章

  1. 机器学习算法之 logistic、Softmax 回归
  2. ubuntu系统下Java环境JDK的安装
  3. 解决Ubuntu中文件管理器死掉的情况
  4. 【linux】Ubuntu 18.04 设置桌面快捷启动方式
  5. 大学c语言程序设计大赛,关于举办宁夏大学第二届C语言程序设计大赛的通知
  6. mysql mtop_mysqlmtop2.2运行出错
  7. 使用BusyBox制作根文件系统的理论分析
  8. 【java设计模式】【行为模式Behavioral Pattern】迭代器模式Iterator Pattern
  9. 终端mysql Operation not permitted错误解决方案
  10. Spring中DispacherServlet、WebApplicationContext、ServletContext的关系