LeetCode:1976. 到达目的地的方案数(spfa + 记忆化 Java)

news2024/11/15 7:01:42

目录

1976. 到达目的地的方案数

原题链接

题目描述:

实现代码与解析:

spfa + 记忆化

原理思路:


1976. 到达目的地的方案数

原题链接

1976. 到达目的地的方案数

题目描述:

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

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

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

示例 1:

输入:n = 7, roads = [[0,6,7],[0,1,2],[1,2,3],[1,3,3],[6,3,3],[3,5,1],[6,5,1],[2,5,1],[0,4,5],[4,6,2]]
输出:4
解释:从路口 0 出发到路口 6 花费的最少时间是 7 分钟。
四条花费 7 分钟的路径分别为:
- 0 ➝ 6
- 0 ➝ 4 ➝ 6
- 0 ➝ 1 ➝ 2 ➝ 5 ➝ 6
- 0 ➝ 1 ➝ 3 ➝ 5 ➝ 6

示例 2:

输入:n = 2, roads = [[1,0,10]]
输出:1
解释:只有一条从路口 0 到路口 1 的路,花费 10 分钟。

提示:

  • 1 <= n <= 200
  • n - 1 <= roads.length <= n * (n - 1) / 2
  • roads[i].length == 3
  • 0 <= ui, vi <= n - 1
  • 1 <= timei <= 109
  • ui != vi
  • 任意两个路口之间至多有一条路。
  • 从任意路口出发,你能够到达其他任意路口。

实现代码与解析:

spfa + 记忆化

public class Solution {
    public static final int N = (int) 210;
    public static final int M = N * N;
    public static final long MOD = (long) 1e9 + 7;
    int[] w = new int[M], h = new int[N], e = new int[M], ne = new int[M];  // 邻接表
    long[] dist = new long[N];
    int idx;
    boolean[] st = new boolean[N]; // 判断是否走过
    long[] mer = new long[N]; // 记忆化数组
    // 加边方法
    public void add(int a, int b, int c) {
        e[idx] = b; w[idx] = c; ne[idx] = h[a]; h[a] = idx++;
    }

    public int countPaths(int n, int[][] roads) {

        // 初始化表头
        Arrays.fill(h, -1);

        // 加边,赋权重
        for (int i = 0; i < roads.length; i++) {
            int a = roads[i][0];
            int b = roads[i][1];
            int c = roads[i][2];
            add(a, b, c);
            add(b, a, c);
        }

        // spfa获取最短路
        long min = spfa(n);
        Arrays.fill(mer, -1);
        Arrays.fill(st, false);
        // 反向dfs获取最短路的个数
        // 利用记忆化搜索优化
        long res = dfs(n - 1, min);
        res %= MOD;
        System.out.println(res);
        return (int)res;
    }

    // spfa 算法模板,原理是利用减小的路径长度对应的节点去更新其他的,图论万能的算法,而且也是最好记的
    public long spfa(int n) {

        Arrays.fill(dist, Long.MAX_VALUE);
        Queue<Integer> q = new LinkedList<>();
        q.offer(0);
        dist[0] = 0;
        st[0] = true;

        while (!q.isEmpty()) {
            int t = q.peek();
            q.poll();
            st[t] = false;
            for (int i = h[t]; i != -1; i = ne[i]) {
                int j = e[i];
                if (dist[j] > dist[t] + w[i]) {
                    dist[j] = dist[t] + w[i];
                    if (!st[j]) {
                        q.offer(j);
                        st[j] = true;
                    }
                }
            }
        }
        return dist[n - 1];
    }

    public long dfs(int cur, long d) {

        if (dist[cur] != d) return 0;
        if (cur == 0) return 1;
        if (mer[cur] != -1) return mer[cur]; // 如果已经记录过,不再走,直接获取此结果即可
        long res = 0;
        for (int i = h[cur]; i != -1; i = ne[i]) {
            int j = e[i];
            if (st[j]) continue;
            res += dfs(j, d - w[i]);
            res %= MOD;
        }
        mer[cur] = res;
        return res;
    }
}

原理思路:

        利用最短路算法spfa,或者其他最短路算法,算出到目标节点最短的路径长度,然后利用dfs和记忆化搜索,反向寻路,找出结果。

        记得开long。

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

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

相关文章

企业级虚拟主播解决方案及制作流程

为满足企业对于高质量、高效率视频内容的需求&#xff0c;美摄科技推出了一款创新的虚拟主播解决方案。该方案结合先进的文字转视频技术和云端计算能力&#xff0c;帮助企业快速制作数字人视频&#xff0c;实现品牌宣传的多样化和个性化。 一、方案概述 美摄科技虚拟主播解决…

P-States/C-States/S-States/G-States/D-States

P-States是指处理器的性能状态&#xff0c;可以根据需要调整处理器的工作频率和电压来平衡性能和能效。 S-States是指系统的睡眠状态&#xff0c;可以让系统在空闲时进入低功耗状态以节省能量。 G-States是系统的全局状态&#xff0c;通常用于描述整个系统的运行状态。 C-St…

华为OD机试 - 数字排列 - 深度优先搜索dfs算法(Java 2024 C卷 100分)

目录 专栏导读一、题目描述二、输入描述三、输出描述1、输入2、输出3、说明 四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2024C卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&a…

代码随想录day13(1)栈与队列:用栈实现队列(leetcode232)

题目要求&#xff1a;使用栈实现push、pop、empty、peek&#xff08;返回队列首部元素&#xff09;。 思路&#xff1a;本题思路比较容易&#xff0c;即用两个栈模拟即可&#xff0c;pop时只需要先判断stackout栈是否为空&#xff0c;如果不空直接弹出&#xff0c;如果空就将s…

卷级实时备份的底层数据处理原理

一、任意时间点回退 实时备份数据&#xff0c;意味着备份数据和生产数据是时刻保持一致的状态&#xff0c;在这种情况下&#xff0c;要做到任意时间点回退恢复&#xff0c;需要借助特出的存储空间结构。 云祺在对目标卷进行实时备份时&#xff0c;在备份系统本地存放实时备份过…

迁移篇 | MatrixOne与MySQL全面对比

Part 1 迁移背景 Skyable 自研了物联网私有云平台用于 IoT 设备的数据上报和协议解析&#xff0c;由于管理设备数量的增加导致设备上报的数据量越来越大&#xff0c;架构中原使用的 MySQL 数据库&#xff08;分库分表&#xff09;的部分业务在对设备上报信息进行相关的查询时&…

《PyTorch深度学习实践》第十一讲卷积神经网络进阶

一、 1、卷积核超参数选择困难&#xff0c;自动找到卷积的最佳组合。 2、1x1卷积核&#xff0c;不同通道的信息融合。使用1x1卷积核虽然参数量增加了&#xff0c;但是能够显著的降低计算量(operations) 3、Inception Moudel由4个分支组成&#xff0c;要分清哪些是在Init里定义…

virsh 快速复制一个虚拟机

在很多测试环境中&#xff0c;想快速复制一个虚拟机&#xff0c;如何实现&#xff1f; 假如环境中已有一个虚拟机&#xff0c;查看虚拟机磁盘信息 # virsh domblklist hc1Target Source -------------------------------sda /data/vms/hc1.qcow2hda -复制一份镜像文…

初阶数据结构:排序(学习笔记)

目录 1. 各种排序算法的分类2. 插入排序2.1 直接插入排序2.2 希尔排序 3. 选择排序3.1 选择排序3.2 堆排序4. 交换排序4.1 冒泡排序4.2 快速排序4.2.1 霍尔法&#xff08;hoare&#xff09;4.2.2 挖坑法&#xff08;hole&#xff09;4.4.3 前后指针法4.4.4 补充&#xff1a;非递…

【项目管理】CMMI-质量保证过程

质量保证过程&#xff08;PQA)&#xff1a;通过质量保证活动&#xff0c;确保过程与产品满足过程、规程及相应的要求&#xff0c;确保问题得到关注与解决&#xff0c;使工作人员和管理者能够客观地了解过程与相关的工作产品。QA工程师应实施质量保证策划活动&#xff0c;客观地…

常用的17个运维监控系统(必备知识)

1. Zabbix Zabbix 作为企业级的网络监控工具&#xff0c;通过从服务器&#xff0c;虚拟机和网络设备收集的数据提供实时监控&#xff0c;自动发现&#xff0c;映射和可扩展等功能。 Zabbix的企业级监控软件为用户提供内置的Java应用服务器监控&#xff0c;硬件监控&#xff0c…

【Android】源码解析 Activity 的构成

本文是基于 Android 14 的源码解析。 当我们写 Activity 时会调用 setContentView() 方法来加载布局。现在来看看 setContentView() 方法是怎么实现的&#xff0c;源码如下所示&#xff1a; 路径&#xff1a;/frameworks/base/core/java/android/app/Activity.javapublic void…

uniapp报错:request:fail abort statusCode:-1 Chain validation failed

uniapp报错信息记录 场景: 半年没碰过的app&#xff0c;今个儿突然无法登录了。 打开控制台&#xff0c;报错信息如下 {msg: request:fail abort statusCode:-1 Chain validation failed}奇怪的是用 apifox 调用相关的接口&#xff0c;可以正常运行&#xff0c;app却不行。 好…

怎么将pom在文件放到src下方

今天在IDEA从git拉取项目的时候&#xff0c;发现pom.xml文件在文件夹src的上方&#xff0c;平时看惯了项目的pom.xml文件在文件夹src的下方&#xff0c;应该怎么去设置呢&#xff1f; 点击设置——>点击Folder Always on Top 即可 参考&#xff1a;http://t.csdnimg.cn/s34…

LCR 126. 斐波那契数

解题思路&#xff1a; 动态规划 class Solution {public int fib(int n) {if (n < 1) return n;int[] dp new int[n1];dp[0] 0;dp[1] 1;for (int i 2; i < n; i) {//取模运算防止整数溢出dp[i] (dp[i - 1] dp[i - 2]) % 1000000007;}return dp[n];} }

600+企业齐聚!第十四届中国国际储能大会暨展览会即将在杭州盛大开幕

数字储能网讯&#xff1a;由中国化学与物理电源行业协会主办&#xff0c;中国化学与物理电源行业协会储能应用分会和中国储能网联合承办的第十四届中国国际储能大会暨展览会将于2024年3月10日在杭州国际博览中心盛大启幕&#xff0c;大会主题为“共建储能生态链&#xff0c;共创…

读算法的陷阱:超级平台、算法垄断与场景欺骗笔记01_比价

1. 科技正在改善我们的生活 1.1. 从表象看&#xff0c;网络世界为我们带来了诸多便利 1.1.1. 比价网站的创建、各式各样的电商促销、数不尽的手机应用程序的确降低了商品的售价&#xff0c;提升了产品的品质&#xff0c;丰富了消费者的选择 1.2. …

【PCL】(十七)从距离图像中提取点云的边界

&#xff08;十七&#xff09;从测距图像中提取边界 Object(Obstacle) border&#xff1a;属于物体的最外面的可见点&#xff1b; Shadow border&#xff1a;背景中与物体相邻的点&#xff1b; Veil points&#xff1a;Object border和Shadow border之间的插值点。 以下代码…

web坦克大战小游戏

H5小游戏源码、JS开发网页小游戏开源源码大合集。无需运行环境,解压后浏览器直接打开。有需要的订阅后,私信本人,发源码,含60+小游戏源码。如五子棋、象棋、植物大战僵尸、贪吃蛇、飞机大战、坦克大战、开心消消乐、扑鱼达人、扫雷、打地鼠、斗地主等等。 <!DOCTYPE htm…