题目
类型:BFS
解题思路
代码
class Solution {
static int N = 10010, M = 4 * N, INF = 0x3f3f3f3f, idx = 0;
static int[] he = new int[N], e = new int[M], ne = new int[M];
void add(int a, int b) {
e[idx] = b;
ne[idx] = he[a];
he[a] = idx;
idx++;
}
public int secondMinimum(int n, int[][] edges, int time, int change) {
Arrays.fill(he, -1);
idx = 0;
for (int[] e : edges) {
int u = e[0], v = e[1];
add(u, v); add(v, u);
}
Deque<int[]> d = new ArrayDeque<>();
int[] dist1 = new int[n + 10], dist2 = new int[n + 10];
Arrays.fill(dist1, INF);
Arrays.fill(dist2, INF);
d.addLast(new int[]{1, 0});
dist1[1] = 0;
while (!d.isEmpty()) {
int[] poll = d.pollFirst();
int u = poll[0], dist = poll[1];
for (int i = he[u]; i != -1; i = ne[i]) {
int j = e[i];
if (dist1[j] > dist + 1) {
dist2[j] = dist1[j];
dist1[j] = dist + 1;
d.addLast(new int[]{j, dist1[j]});
d.addLast(new int[]{j, dist2[j]});
} else if (dist1[j] < dist + 1 && dist + 1 < dist2[j]) {
dist2[j] = dist + 1;
d.addLast(new int[]{j, dist2[j]});
}
}
}
int ans = 0;
for (int i = 0; i < dist2[n]; i++) {
int a = ans / change, b = ans % change;
int wait = a % 2 == 0 ? 0 : change - b;
ans += time + wait;
}
return ans;
}
}