This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <climits>
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
using ll = long long;
struct edge {
int to;
ll weight;
bool operator >(edge const& rhs) const {
return weight > rhs.weight;
}
};
vector<ll> dijkstra(vector<vector<edge>> const& graph, int const start) {
priority_queue<edge, vector<edge>, greater<edge>> pq;
vector<ll> dist(graph.size(), LLONG_MAX / 3);
dist[start] = 0;
pq.push({ start, 0 });
while (!pq.empty()) {
auto const [cur, cur_dist] = pq.top();
pq.pop();
if (cur_dist != dist[cur])
continue;
for (auto const& [neigh, weight] : graph[cur]) {
ll const new_dist = cur_dist + weight;
if (new_dist < dist[neigh]) {
dist[neigh] = new_dist;
pq.push({ neigh, new_dist });
}
}
}
return dist;
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
int n, k, m;
cin >> n >> k >> m;
vector<int> important(k);
for (int& x : important) {
cin >> x;
x--;
}
vector<vector<edge>> graph(n);
for (int i = 0; i < m; i++) {
int u, v;
ll w;
cin >> u >> v >> w;
u--; v--;
graph[u].push_back({ v, w });
graph[v].push_back({ u, w });
}
vector<vector<ll>> dist(k);
for (int i = 0; i < k; i++)
dist[i] = dijkstra(graph, important[i]);
if (k == 2) {
cout << dist[0][important[1]] << "\n";
}
else {
ll min_dist = LLONG_MAX / 3;
for (int i = 0; i < n; i++) {
ll const cur_dist = dist[0][i] + dist[1][i] + dist[2][i];
min_dist = min(min_dist, cur_dist);
}
cout << min_dist << "\n";
}
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |