제출 #1278761

#제출 시각아이디문제언어결과실행 시간메모리
1278761Canuc80kCities (BOI16_cities)C++20
100 / 100
2152 ms44708 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; const ll N = 1e5 + 1; ll n, k, m; ll a[N], f[(1ll << 5)][N]; vector<array<ll, 2>> g[N]; int main() { ios_base::sync_with_stdio(0), cin.tie(0); cin >> n >> k >> m; for (int i = 1; i <= k; i ++) cin >> a[i], a[i] --; for (int i = 1; i <= m; i ++) { ll u, v, k; cin >> u >> v >> k; u --; v --; g[u].push_back({v, k}); g[v].push_back({u, k}); } memset(f, 0x3f, sizeof f); for (int i = 1; i <= k; i ++) f[(1ll << (i - 1))][a[i]] = 0; for (int i = 0; i < n; i ++) f[0][i] = 0; for (int mask = 0; mask < (1ll << k); mask ++) { if (mask == 0) continue; for (int submask = mask; ; submask = (submask - 1) & mask) { for (int u = 0; u < n; u ++) { int other = mask ^ submask; f[mask][u] = min(f[mask][u], f[submask][u] + f[other][u]); } if (submask == 0) break; } priority_queue<array<ll, 2>, vector<array<ll, 2>>, greater<array<ll, 2>>> pq; for (int i = 0; i < n; i ++) pq.push({f[mask][i], i}); while (pq.size()) { auto [cost, u] = pq.top(); pq.pop(); for (auto [v, w]: g[u]) { if (f[mask][v] > f[mask][u] + w) { f[mask][v] = f[mask][u] + w; pq.push({f[mask][v], v}); } } } } ll res = 1e18; for (int i = 0; i < n; i ++) res = min(res, f[(1ll << k) - 1][i]); cout << res; }
#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...