⭐️寒假新坑——代码之狐的每日做题笔记
2045. 到达目的地的#第二短时间-Hard
题目描述:
城市用一个 双向连通 图表示,图中有 n
个节点,从 1
到 n
编号(包含 1
和 n
)。图中的边用一个二维整数数组 edges
表示,其中每个 edges[i] = [ui, vi]
表示一条节点 ui
和节点 vi
之间的双向连通边。每组节点对由 最多一条 边连通,顶点不存在连接到自身的边。穿过任意一条边的时间是 time
分钟。
每个节点都有一个交通信号灯,每 change
分钟改变一次,从绿色变成红色,再由红色变成绿色,循环往复。所有信号灯都 同时 改变。你可以在 任何时候 进入某个节点,但是 只能 在节点 信号灯是绿色时 才能离开。如果信号灯是 绿色 ,你 不能 在节点等待,必须离开。
第二小的值 是 严格大于 最小值的所有值中最小的值。
- 例如,
[2, 3, 4]
中第二小的值是3
,而[2, 2, 4]
中第二小的值是4
。
给你 n
、edges
、time
和 change
,返回从节点 1
到节点 n
需要的 第二短时间 。
注意:
- 你可以 任意次 穿过任意顶点,包括
1
和n
。 - 你可以假设在 启程时 ,所有信号灯刚刚变成 绿色 。
解题思路:
关键在于——每个节点第二次不同时间访问后剪枝
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=