返回介绍

solution / 2000-2099 / 2045.Second Minimum Time to Reach Destination / README_EN

发布于 2024-06-17 01:03:11 字数 6737 浏览 0 评论 0 收藏 0

2045. Second Minimum Time to Reach Destination

中文文档

Description

A city is represented as a bi-directional connected graph with n vertices where each vertex is labeled from 1 to n (inclusive). The edges in the graph are represented as a 2D integer array edges, where each edges[i] = [ui, vi] denotes a bi-directional edge between vertex ui and vertex vi. Every vertex pair is connected by at most one edge, and no vertex has an edge to itself. The time taken to traverse any edge is time minutes.

Each vertex has a traffic signal which changes its color from green to red and vice versa every change minutes. All signals change at the same time. You can enter a vertex at any time, but can leave a vertex only when the signal is green. You cannot wait at a vertex if the signal is green.

The second minimum value is defined as the smallest value strictly larger than the minimum value.

  • For example the second minimum value of [2, 3, 4] is 3, and the second minimum value of [2, 2, 4] is 4.

Given n, edges, time, and change, return _the second minimum time it will take to go from vertex _1_ to vertex _n.

Notes:

  • You can go through any vertex any number of times, including 1 and n.
  • You can assume that when the journey starts, all signals have just turned green.

 

Example 1:

       

Input: n = 5, edges = [[1,2],[1,3],[1,4],[3,4],[4,5]], time = 3, change = 5
Output: 13
Explanation:
The figure on the left shows the given graph.
The blue path in the figure on the right is the minimum time path.
The time taken is:
- Start at 1, time elapsed=0
- 1 -> 4: 3 minutes, time elapsed=3
- 4 -> 5: 3 minutes, time elapsed=6
Hence the minimum time needed is 6 minutes.

The red path shows the path to get the second minimum time.

-   Start at 1, time elapsed=0
-   1 -> 3: 3 minutes, time elapsed=3
-   3 -> 4: 3 minutes, time elapsed=6
-   Wait at 4 for 4 minutes, time elapsed=10
-   4 -> 5: 3 minutes, time elapsed=13
Hence the second minimum time is 13 minutes.

Example 2:

Input: n = 2, edges = [[1,2]], time = 3, change = 2
Output: 11
Explanation:
The minimum time path is 1 -> 2 with time = 3 minutes.
The second minimum time path is 1 -> 2 -> 1 -> 2 with time = 11 minutes.

 

Constraints:

  • 2 <= n <= 104
  • n - 1 <= edges.length <= min(2 * 104, n * (n - 1) / 2)
  • edges[i].length == 2
  • 1 <= ui, vi <= n
  • ui != vi
  • There are no duplicate edges.
  • Each vertex can be reached directly or indirectly from every other vertex.
  • 1 <= time, change <= 103

Solutions

Solution 1

class Solution:
  def secondMinimum(
    self, n: int, edges: List[List[int]], time: int, change: int
  ) -> int:
    g = defaultdict(set)
    for u, v in edges:
      g[u].add(v)
      g[v].add(u)
    q = deque([(1, 0)])
    dist = [[inf] * 2 for _ in range(n + 1)]
    dist[1][1] = 0
    while q:
      u, d = q.popleft()
      for v in g[u]:
        if d + 1 < dist[v][0]:
          dist[v][0] = d + 1
          q.append((v, d + 1))
        elif dist[v][0] < d + 1 < dist[v][1]:
          dist[v][1] = d + 1
          if v == n:
            break
          q.append((v, d + 1))
    ans = 0
    for i in range(dist[n][1]):
      ans += time
      if i < dist[n][1] - 1 and (ans // change) % 2 == 1:
        ans = (ans + change) // change * change
    return ans
class Solution {
  public int secondMinimum(int n, int[][] edges, int time, int change) {
    List<Integer>[] g = new List[n + 1];
    Arrays.setAll(g, k -> new ArrayList<>());
    for (int[] e : edges) {
      int u = e[0], v = e[1];
      g[u].add(v);
      g[v].add(u);
    }
    Deque<int[]> q = new LinkedList<>();
    q.offerLast(new int[] {1, 0});
    int[][] dist = new int[n + 1][2];
    for (int i = 0; i < n + 1; ++i) {
      Arrays.fill(dist[i], Integer.MAX_VALUE);
    }
    dist[1][1] = 0;
    while (!q.isEmpty()) {
      int[] e = q.pollFirst();
      int u = e[0], d = e[1];
      for (int v : g[u]) {
        if (d + 1 < dist[v][0]) {
          dist[v][0] = d + 1;
          q.offerLast(new int[] {v, d + 1});
        } else if (dist[v][0] < d + 1 && d + 1 < dist[v][1]) {
          dist[v][1] = d + 1;
          if (v == n) {
            break;
          }
          q.offerLast(new int[] {v, d + 1});
        }
      }
    }
    int ans = 0;
    for (int i = 0; i < dist[n][1]; ++i) {
      ans += time;
      if (i < dist[n][1] - 1 && (ans / change) % 2 == 1) {
        ans = (ans + change) / change * change;
      }
    }
    return ans;
  }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文