Submission #391124

#TimeUsernameProblemLanguageResultExecution timeMemory
391124nikatamlianiCities (BOI16_cities)C++14
100 / 100
2528 ms49384 KiB
#include <bits/stdc++.h> #define ll long long using namespace std; const ll N = 2e5+10; const ll oo = 1e18; ll n, k, m, important[10], dp[32][N]; vector<pair<ll, ll>> edges[N]; void run_dijkstra(int mask) { priority_queue<pair<ll, int>> q; vector<ll> dist(n); vector<bool> visited(n); for(int i = 0; i < n; ++i) { dist[i] = dp[mask][i]; q.push({-dist[i], i}); } while(!q.empty()) { pair<ll, int> p = q.top(); q.pop(); if(dist[p.second] < -p.first) continue; for(pair<ll, int> to : edges[p.second]) { ll dst = to.second - p.first; if(dist[to.first] > dst) { dist[to.first] = dst; q.push({-dst, to.first}); } } } for(int i = 0; i < n; ++i) { dp[mask][i] = dist[i]; } } int main() { ios::sync_with_stdio(0); cin.tie(0); cin >> n >> k >> m; for(int i = 0; i < k; ++i) { cin >> important[i]; --important[i]; } for(int i = 0; i < n; ++i) { for(int mask = 0; mask < (1 << k); ++mask) { dp[mask][i] = oo; } } for(int i = 0; i < k; ++i) { dp[1 << i][important[i]] = 0; } for(int i = 0; i < m; ++i) { ll u, v, c; cin >> u >> v >> c; --u, --v; edges[u].push_back({v, c}); edges[v].push_back({u, c}); } for(int mask = 1; mask < (1 << k); ++mask) { for(int i = 0; i < n; ++i) { for(int submask = mask; submask > 0; submask = (submask - 1) & mask) { dp[mask][i] = min(dp[mask][i], dp[submask][i] + dp[mask ^ submask][i]); } } run_dijkstra(mask); } ll ans = oo; for(int i = 0; i < n; ++i) { ans = min(ans, dp[(1 << k) - 1][i]); } cout << ans << endl; }
#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...