Submission #485706

#TimeUsernameProblemLanguageResultExecution timeMemory
485706duchungCities (BOI16_cities)C++17
100 / 100
2906 ms48896 KiB
#include<bits/stdc++.h> using namespace std; #define int long long #define ii pair<int , int> const int INF = 1e18; const int N = 1e5 + 5; const int K = 5; int n , k , m; vector<ii> edge[N]; int dist[N][1 << K]; void dijkstra(int mask) { priority_queue<ii , vector<ii> , greater<ii>> q; for (int i = 1 ; i <= n ; ++i) q.push({dist[i][mask] , i}); while(!q.empty()) { int d = q.top().first; int u = q.top().second; q.pop(); if (dist[u][mask] != d) continue; for (auto adj : edge[u]) { int v = adj.first; int w = adj.second; if (dist[v][mask] > dist[u][mask] + w) { dist[v][mask] = dist[u][mask] + w; q.push({dist[v][mask] , v}); } } } } signed main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> n >> k >> m; for (int mask = 0 ; mask < (1 << k) ; ++mask) { for (int i = 1 ; i <= n ; ++i) { dist[i][mask] = INF; } } for (int i = 1 ; i <= k ; ++i) { int tmp; cin >> tmp; dist[tmp][1 << (i - 1)] = 0; } for (int i = 1 ; i <= m ; ++i) { int u , v , w; cin >> u >> v >> w; edge[u].push_back({v , w}); edge[v].push_back({u , w}); } for (int mask = 1 ; mask < (1 << k) ; ++mask) { for (int sub = mask ; sub >= 1 ; sub = (sub - 1) & mask) { for (int i = 1 ; i <= n ; ++i) { dist[i][mask] = min(dist[i][mask] , dist[i][sub] + dist[i][mask ^ sub]); } } dijkstra(mask); } int ans = INF; for (int i = 1 ; i <= n ; ++i) ans = min(ans , dist[i][(1 << k) - 1]); cout << ans; }
#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...