제출 #943334

#제출 시각아이디문제언어결과실행 시간메모리
943334GrandTiger1729Cities (BOI16_cities)C++17
74 / 100
6019 ms23200 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()); long long ans = INF; do { vector<long long> res = dijkstra(a[0]); for (int i = 1; i < K - 1; i++) { res = merge(res, dijkstra(a[i])); } ans = min(ans, res[a[K - 1]]); } while (next_permutation(a.begin(), a.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...