Submission #147331

#TimeUsernameProblemLanguageResultExecution timeMemory
147331cerberusCities (BOI16_cities)C++17
100 / 100
2890 ms39964 KiB
/* cerberus97 - Hanit Banga */ #include <iostream> #include <iomanip> #include <cassert> #include <cmath> #include <cstdio> #include <cstring> #include <cstdlib> #include <map> #include <set> #include <queue> #include <stack> #include <vector> #include <algorithm> using namespace std; #define pb push_back #define fast_cin() ios_base::sync_with_stdio(false); cin.tie(NULL) typedef long long ll; typedef long double ld; typedef pair <int, int> pii; typedef pair <ll, ll> pll; const int N = 1e5 + 10, K = 5, S = (1 << K) + 10; const ll inf = 1e15 + 42; int imp[K]; vector<pii> g[N]; ll dp[S][N]; int main() { fast_cin(); int n, k, m; cin >> n >> k >> m; for (int i = 0; i < k; ++i) { cin >> imp[i]; } for (int i = 0; i < m; ++i) { int u, v, w; cin >> u >> v >> w; g[u].pb({v, w}); g[v].pb({u, w}); } int tot = (1 << k), all = tot - 1; for (int mask = 1; mask < tot; ++mask) { for (int u = 1; u <= n; ++u) { dp[mask][u] = inf; } } for (int i = 0; i < k; ++i) { dp[1 << i][imp[i]] = 0; } for (int mask = 1; mask < tot; ++mask) { for (int smask = 0; smask < mask; ++smask) { if ((mask & smask) != smask) { continue; } for (int u = 1; u <= n; ++u) { dp[mask][u] = min(dp[mask][u], dp[smask][u] + dp[mask ^ smask][u]); } } priority_queue<pll, vector<pll>, greater<pll>> q; for (int u = 1; u <= n; ++u) { q.push({dp[mask][u], u}); } while (!q.empty()) { auto cur = q.top(); q.pop(); int u = cur.second; if (dp[mask][u] != cur.first) { continue; } for (auto &e : g[u]) { int v = e.first, w = e.second; ll cand = dp[mask][u] + w; if (cand < dp[mask][v]) { dp[mask][v] = cand; q.push({cand, v}); } } } } ll ans = inf; for (int u = 1; u <= n; ++u) { ans = min(ans, dp[all][u]); } 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...