Submission #1121253

#TimeUsernameProblemLanguageResultExecution timeMemory
1121253LonlyRCities (BOI16_cities)C++17
74 / 100
6046 ms165428 KiB
#include<bits/stdc++.h> #define ll long long #define all(x) x.begin(), x.end() using namespace std; const int maxn = 1e5 + 5; int n, k, m; int chosen[maxn]; vector<pair<int,int>> adj[maxn]; vector<array<int, 3>> edges; template<typename T> bool minimize(T& a, const T& b){ if(a > b){ return a = b, true; } return false; } vector<int> ok; #define iii tuple<ll,int,int> ll d[32][maxn]; signed main() { ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); // freopen("test.inp", "r", stdin); // freopen("test.out", "w", stdout); cin >> n >> k >> m; for (int i = 1, x; i <= k; i++) cin >> x, chosen[x] = 1; k = accumulate(chosen + 1, chosen + n + 1, 0ll); for (int i = 1; i <= n; i++) if (chosen[i]) ok.emplace_back(i), chosen[i] = ok.size(); for (int i = 1, u, v, w; i <= m; i++) cin >> u >> v >> w, adj[u].emplace_back(v, w), adj[v].emplace_back(u, w); priority_queue<iii, vector<iii>, greater<iii>> pq; memset(d, 0x3f, sizeof d); ll oo = d[0][0]; for (int i = 1; i <= n; i++) { int bit = 0; if (chosen[i]) bit = 1 << (chosen[i] - 1); d[bit][i] = 0; if (chosen[i]) pq.emplace(0, i, bit); } int full = (1 << k) - 1; while (pq.size()) { auto to = pq.top(); pq.pop(); ll val; int u, mask; tie(val, u, mask) = to; if (val != d[mask][u]) continue; for (auto it : adj[u]) { int v, w; tie(v, w) = it; for (int supr = mask; supr < (1 << k); supr = (supr + 1) | mask) { if (d[supr ^ mask][v] == oo) continue; if (d[mask][u] + d[supr ^ mask][v] + w < d[supr][v]) { d[supr][v] = d[mask][u] + d[supr ^ mask][v] + w; pq.emplace(d[supr][v], v, supr); } } } } ll res = oo; for (int i = 1; i <= n; i++) res = min(res, d[full][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...