题目

类型:BFS
image.png

解题思路

image.png

image.png

代码

  1. class Solution {
  2. static int N = 10010, M = 4 * N, INF = 0x3f3f3f3f, idx = 0;
  3. static int[] he = new int[N], e = new int[M], ne = new int[M];
  4. void add(int a, int b) {
  5. e[idx] = b;
  6. ne[idx] = he[a];
  7. he[a] = idx;
  8. idx++;
  9. }
  10. public int secondMinimum(int n, int[][] edges, int time, int change) {
  11. Arrays.fill(he, -1);
  12. idx = 0;
  13. for (int[] e : edges) {
  14. int u = e[0], v = e[1];
  15. add(u, v); add(v, u);
  16. }
  17. Deque<int[]> d = new ArrayDeque<>();
  18. int[] dist1 = new int[n + 10], dist2 = new int[n + 10];
  19. Arrays.fill(dist1, INF);
  20. Arrays.fill(dist2, INF);
  21. d.addLast(new int[]{1, 0});
  22. dist1[1] = 0;
  23. while (!d.isEmpty()) {
  24. int[] poll = d.pollFirst();
  25. int u = poll[0], dist = poll[1];
  26. for (int i = he[u]; i != -1; i = ne[i]) {
  27. int j = e[i];
  28. if (dist1[j] > dist + 1) {
  29. dist2[j] = dist1[j];
  30. dist1[j] = dist + 1;
  31. d.addLast(new int[]{j, dist1[j]});
  32. d.addLast(new int[]{j, dist2[j]});
  33. } else if (dist1[j] < dist + 1 && dist + 1 < dist2[j]) {
  34. dist2[j] = dist + 1;
  35. d.addLast(new int[]{j, dist2[j]});
  36. }
  37. }
  38. }
  39. int ans = 0;
  40. for (int i = 0; i < dist2[n]; i++) {
  41. int a = ans / change, b = ans % change;
  42. int wait = a % 2 == 0 ? 0 : change - b;
  43. ans += time + wait;
  44. }
  45. return ans;
  46. }
  47. }