Submission #682620

#TimeUsernameProblemLanguageResultExecution timeMemory
682620Ronin13Cities (BOI16_cities)C++14
100 / 100
2716 ms48736 KiB
#include <bits/stdc++.h> #define ll long long #define ull unsigned ll #define f first #define s second #define pii pair<ll,ll> #define pll pair<ll,ll> #define pb push_back #define epb emplace_back using namespace std; const int nmax =1e5 + 1; const ll linf = 1e18 + 1; ll d[nmax][32]; vector <vector <pll> > g(nmax); int main(){ int n; cin >> n; int k; cin >> k; int m; cin >> m; int imp[k + 1]; for(int i= 1; i <= n; i++) for(int j = 0; j < 32; j++) d[i][j] = linf; for(int i = 1; i <= k; i++) { cin >> imp[i]; } for(int i= 1; i <= m; i++){ int u, v, len; cin >> u >> v >> len; g[u].epb(v, len); g[v].epb(u, len); } for(int i = 0; i < k; i++){ d[imp[i + 1]][(1 << i)] = 0; } for(int mask = 1; mask < (1 << k); mask++){ for(int submask = 1; submask < mask; submask++){ if((mask | submask) != mask) continue; for(int j = 1; j <= n; j++) d[j][mask] = min(d[j][mask], d[j][submask] + d[j][mask ^ submask]); } priority_queue<pll> st; for(int i = 1; i <= n; ++i){ if(d[i][mask] != linf) st.push({-d[i][mask], i}); } vector <bool> used(n + 1); while(!st.empty()){ int v = st.top().s; st.pop(); if(used[v]) continue; used[v] = true; for(auto x : g[v]){ int to = x.f; ll len = x.s; if(d[v][mask] + len < d[to][mask]){ d[to][mask] = d[v][mask] + len; st.push({-d[to][mask], to}); } } } } cout << d[imp[1]][(1 << k) - 1]; 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...