Submission #943349

#TimeUsernameProblemLanguageResultExecution timeMemory
943349GrandTiger1729Cities (BOI16_cities)C++17
100 / 100
1947 ms21492 KiB
#include <bits/stdc++.h> using namespace std; const long long INF = 1e18; int main() { cin.tie(0)->sync_with_stdio(0); int n, K, m; cin >> n >> K >> m; vector<int> a(K); for (int i = 0; i < K; i++) { cin >> a[i]; a[i]--; } vector<vector<pair<int, int>>> g(n); for (int i = 0; i < m; i++) { int u, v, w; cin >> u >> v >> w; u--, v--; g[u].emplace_back(v, w); g[v].emplace_back(u, w); } auto dijkstra = [&](int i) { priority_queue<pair<long long, int>, vector<pair<long long, int>>, greater<>> pq; pq.emplace(0, i); vector<long long> dis(n, INF); vector<bool> vis(n); while (pq.size()) { auto [d, u] = pq.top(); pq.pop(); if (vis[u]) { continue; } vis[u] = 1; dis[u] = d; for (auto &[v, w] : g[u]) { if (dis[v] > dis[u] + w) { dis[v] = dis[u] + w; pq.emplace(dis[v], v); } } } return dis; }; auto merge = [&](const vector<long long> &b, const vector<long long> &c) -> vector<long long> { priority_queue<pair<long long, int>, vector<pair<long long, int>>, greater<>> pq; for (int i = 0; i < n; i++) { pq.emplace(b[i] + c[i], i); } vector<long long> ret(n, INF); vector<bool> vis(n); while (pq.size()) { auto [d, u] = pq.top(); pq.pop(); if (vis[u]) { continue; } vis[u] = 1; ret[u] = d; for (auto &[v, w] : g[u]) { if (ret[v] > ret[u] + w) { ret[v] = ret[u] + w; pq.emplace(ret[v], v); } } } return ret; }; sort(a.begin(), a.end()); vector<vector<long long>> dis(K); for (int i = 0; i < K; i++) { dis[i] = dijkstra(a[i]); } long long ans = INF; vector<int> ord(K); iota(ord.begin(), ord.end(), 0); set<vector<int>> vis; do { if (vis.find(ord) != vis.end()) { continue; } swap(ord[0], ord[1]); vis.insert(ord); swap(ord[0], ord[1]); vector<long long> res = dis[ord[0]]; for (int i = 1; i < K - 1; i++) { res = merge(res, dis[ord[i]]); } ans = min(ans, res[a[ord[K - 1]]]); } while (next_permutation(ord.begin(), ord.end() - 1)); cout << ans << '\n'; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...