Submission #746979

#TimeUsernameProblemLanguageResultExecution timeMemory
746979fishy15Crocodile's Underground City (IOI11_crocodile)C++17
100 / 100
439 ms61452 KiB
#include <queue> #include <utility> #include <vector> #include "crocodile.h" using namespace std; constexpr int INF = 0x3f3f3f3f; pair<int, int> add_d(pair<int, int> cur_d, int new_d) { if (new_d <= cur_d.first) { cur_d.second = cur_d.first; cur_d.first = new_d; } else if (new_d < cur_d.second) { cur_d.second = new_d; } return cur_d; } int travel_plan(int N, int M, int R[][2], int L[], int K, int P[]) { vector<vector<pair<int, int>>> adj(N); for (int i = 0; i < M; i++) { adj[R[i][0]].push_back({R[i][1], L[i]}); adj[R[i][1]].push_back({R[i][0], L[i]}); } // first and second shortest distances vector<pair<int, int>> d(N, {INF, INF}); vector<int> vis_count(N); // {second, location} priority_queue<pair<int, int>, vector<pair<int, int>>, greater<>> pq; for (int i = 0; i < K; i++) { int cur = P[i]; d[cur] = {0, 0}; pq.push({0, cur}); } while (!pq.empty()) { auto [dd, t] = pq.top(); pq.pop(); if (d[t].second == dd) { for (auto [v, w] : adj[t]) { auto nxt_d = add_d(d[v], dd + w); if (nxt_d.second < d[v].second) { pq.push({nxt_d.second, v}); } d[v] = nxt_d; } } } return d[0].second; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...