2045 - Second Minimum Time to Reach Destination

 JAVA

  • 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;
        }
    }

C++

Comments