【每日一题见微知著】BFS-次短路——到达目的地的第二短时间-Hard(今天这个难度也对啦)

⭐️寒假新坑——代码之狐的每日做题笔记

2045. 到达目的地的#第二短时间-Hard
题目描述:

城市用一个 双向连通 图表示,图中有 n 个节点,从 1n 编号(包含 1n)。图中的边用一个二维整数数组 edges 表示,其中每个 edges[i] = [ui, vi] 表示一条节点 ui 和节点 vi 之间的双向连通边。每组节点对由 最多一条 边连通,顶点不存在连接到自身的边。穿过任意一条边的时间是 time 分钟。

每个节点都有一个交通信号灯,每 change 分钟改变一次,从绿色变成红色,再由红色变成绿色,循环往复。所有信号灯都 同时 改变。你可以在 任何时候 进入某个节点,但是 只能 在节点 信号灯是绿色时 才能离开。如果信号灯是 绿色 ,你 不能 在节点等待,必须离开。

第二小的值严格大于 最小值的所有值中最小的值。

  • 例如,[2, 3, 4] 中第二小的值是 3 ,而 [2, 2, 4] 中第二小的值是 4

给你 nedgestimechange ,返回从节点 1 到节点 n 需要的 第二短时间

注意:

  • 你可以 任意次 穿过任意顶点,包括 1n
  • 你可以假设在 启程时 ,所有信号灯刚刚变成 绿色
解题思路:

关键在于——每个节点第二次不同时间访问后剪枝

BFS(广度优先搜索)-次短路查找-剪枝-数学计算判断等待时间

  • 使用BFS算法作为基础-每个节点在搜索时可以被不同搜索到两次(相同时间的到达算一次,第二次搜索到时是次短路到达时间)
  • 搜索到两次以后不在被访问到-在当前时间到达奇数个changeTime时,等待到偶数个changeTime才访问下一个节点
  • 第二次访问到n节点输出答案
代码实现:
class Solution {
   
    public int secondMinimum(int n, int[][] edges, int time, int change) {
   
        //保存时间
        int curTime=0;
        //保存第几次访问
        byte[] v=new byte[n];
        //保存访问时间
        int[] t=
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代码之狐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值