Submission #648454

#TimeUsernameProblemLanguageResultExecution timeMemory
648454ymmCities (BOI16_cities)C++17
14 / 100
5467 ms47436 KiB
#include <bits/stdc++.h> #define Loop(x,l,r) for (ll x = (l); x < (ll)(r); ++x) #define LoopR(x,l,r) for (ll x = (r)-1; x >= (ll)(l); --x) typedef long long ll; typedef std::pair<int, int> pii; typedef std::pair<ll , ll > pll; using namespace std; const int N = 100'010; const ll inf = 1e17; const int K = 5; ll dis[1<<K][N]; vector<pll> A[N]; int imp[K]; int n, k, m; void dij(int msk) { set<pll> s; int fi = __builtin_ctz(msk); Loop (v,0,n) { dis[msk][v] = dis[msk ^ (1<<fi)][v] + dis[1<<fi][v]; s.insert({dis[msk][v], v}); } while (s.size()) { auto [d, v] = *s.begin(); s.erase(s.begin()); for (auto [u, w] : A[v]) { if (d + w < dis[msk][u]) { s.erase( {dis[msk][u], u}); dis[msk][u] = d + w; s.insert({dis[msk][u], u}); } } } } int main() { cin.tie(0) -> sync_with_stdio(false); cin >> n >> k >> m; Loop (i,0,k) { cin >> imp[i]; --imp[i]; } Loop (i,0,m) { ll v, u, w; cin >> v >> u >> w; --v; --u; A[v].push_back({u, w}); A[u].push_back({v, w}); } Loop (msk,1,1<<k) Loop (v,0,n) dis[msk][v] = inf; Loop (i,0,k) dis[1<<i][imp[i]] = 0; Loop (msk,1,1<<k) dij(msk); ll ans = inf; Loop (v,0,n) ans = min(ans, dis[(1<<k)-1][v]); cout << ans << '\n'; }
#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...