#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;
int 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 time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |