Submission #1232956

#TimeUsernameProblemLanguageResultExecution timeMemory
1232956imannCrocodile's Underground City (IOI11_crocodile)C++20
89 / 100
272 ms48540 KiB
#include <iostream> #include <vector> #include <array> #include <queue> #include <limits> #include <algorithm> using ll = long long; const int MAX_N = 100*1000 + 2; std::array<std::vector<std::pair<int, int>>, MAX_N> graph; std::array<bool, MAX_N> terminals; ll travel_plan(int n, int m, int r[][2], int l[], int k, int p[]) { for (int i = 0; i < m; ++i) { graph[r[i][0]].push_back({r[i][1], l[i]}); graph[r[i][1]].push_back({r[i][0], l[i]}); } for (int i = 0; i < k; ++i) { terminals[p[i]] = true; } using T = std::pair<ll, ll>; std::priority_queue<T, std::vector<T>, std::greater<T>> pq; std::array<ll, MAX_N> dist; dist.fill({std::numeric_limits<int>::max()}); for (int i = 0; i < k; ++i) { pq.push({0, p[i]}); dist[p[i]] = 0; } std::array<std::pair<ll, ll>, MAX_N> mins; mins.fill({std::numeric_limits<int>::max(), std::numeric_limits<int>::max()}); while (!pq.empty()) { auto [d, node] = pq.top(); pq.pop(); if (d == std::numeric_limits<int>::max()) { break; } if (d != dist[node]) continue; for (std::pair<int, int> nei : graph[node]) { if (dist[nei.first] > d + nei.second) { std::vector<ll> minOpts = {d + nei.second, mins[nei.first].first, mins[nei.first].second}; std::sort(minOpts.begin(), minOpts.end()); mins[nei.first] = {minOpts[0], minOpts[1]}; if (minOpts[1] != std::numeric_limits<int>::max()) { dist[nei.first] = minOpts[1]; pq.push({dist[nei.first], nei.first}); } } } } if (dist[0] == std::numeric_limits<int>::max()) return -1; return dist[0]; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...