../ Competitive Programming
-rw-r--r--aguang2.0 KiB1 min read

Leet Code Daily 2024-07-28 - Second Minimum Time to Reach Destination

Code

c++
constexpr int kVeryLong = 100000000;

class Solution {
public:
    int secondMinimum(int n, vector<vector<int>>& edges, int time, int change) {

        auto neighborhood = vector<vector<int>>(n);
        for (const auto& edge : edges) {
            neighborhood[edge[0] - 1].push_back(edge[1] - 1);
            neighborhood[edge[1] - 1].push_back(edge[0] - 1);
        }
        auto leave_time = [&](int arrive_time) {
            const int t = arrive_time % (change * 2);
            return (t < change) ? arrive_time : (arrive_time - t + change * 2);
        };

        auto arrive_time =
            vector<pair<int, int>>(n, make_pair(kVeryLong, kVeryLong));
        arrive_time[0] = make_pair(0, kVeryLong);

        auto in_queue = vector<bool>(n, false);

        queue<int> queue;
        queue.push(0);
        in_queue[0] = true;

        for (; !queue.empty(); queue.pop()) {
            auto u = queue.front();
            in_queue[u] = false;
            for (const auto v : neighborhood[u]) {
                auto candidates = vector<int>({
                    arrive_time[v].first,
                    arrive_time[v].second,
                    leave_time(arrive_time[u].first) + time,
                    leave_time(arrive_time[u].second) + time,
                });
                sort(candidates.begin(), candidates.end());
                candidates.erase(unique(candidates.begin(), candidates.end()),
                                 candidates.end());
                auto new_arrive_time = make_pair(candidates[0], candidates[1]);
                if (new_arrive_time != arrive_time[v]) {
                    arrive_time[v] = new_arrive_time;
                    if (!in_queue[v]) {
                        queue.push(v);
                        in_queue[v] = true;
                    }
                }
            }
        }

        return arrive_time[n - 1].second;
    }
};

COMMAND INTERFACE

↑ ↓ navigate · Enter execute · Esc exit · try “whoami”

Loading filesystem…

:help aguang.xyz

A personal website disguised as an operating system.

Ctrl / Cmd + K
Command palette + full-text search
Tab / Shift + Tab
Move between links and controls
Enter
Open a focused link or search result
↑ / ↓ in search
Navigate search results
In a directory filter
Enter/Done or ↓ focuses a result; Esc clears the filter
Esc
Clear a search or close a window