제출 #361582

#제출 시각아이디문제언어결과실행 시간메모리
361582Lam_lai_cuoc_doiCities (BOI16_cities)C++17
100 / 100
2019 ms39312 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; using ld = long double; using ull = unsigned long long; const bool typetest = 0; const int N = 1e5 + 5; const ll Inf = 1e17; int n, m, k; int v[5]; ll d[5][N], dp[1 << 5], d2[5][5][N]; vector<pair<int, ll>> adj[N]; void Read() { cin >> n >> k >> m; for (int i = 0; i < k; ++i) cin >> v[i]; for (int i = 1; i <= m; ++i) { int u, v; ll w; cin >> u >> v >> w; adj[u].push_back({v, w}); adj[v].push_back({u, w}); } } bool Relax(ll d[N], int son, int par, ll w) { if (d[son] > d[par] + w) { d[son] = d[par] + w; return true; } return false; } void Dijkstra(int x, ll d[N]) { fill_n(&d[0], N, Inf); d[x] = 0; struct Tque { int v; ll w; Tque(const int &v = 0, const ll &w = 0) : v(v), w(w) {} bool operator<(const Tque &a) const { return w > a.w; } }; priority_queue<Tque> s; s.emplace(x, 0); while (s.size()) { Tque c = s.top(); s.pop(); if (c.w != d[c.v]) continue; for (auto i : adj[c.v]) if (Relax(d, i.first, c.v, i.second)) s.emplace(i.first, d[i.first]); } } void Dijkstra2(int i, int j) { struct Tque { int v; ll w; Tque(const int &v = 0, const ll &w = 0) : v(v), w(w) {} bool operator<(const Tque &a) const { return w > a.w; } }; priority_queue<Tque> s; for (int x = 1; x <= n; ++x) { d2[i][j][x] = d[i][x] + d[j][x]; s.emplace(x, d2[i][j][x]); } while (s.size()) { Tque c = s.top(); s.pop(); if (d2[i][j][c.v] != c.w) continue; for (auto u : adj[c.v]) if (d2[i][j][u.first] > c.w + u.second) { d2[i][j][u.first] = c.w + u.second; s.emplace(u.first, c.w + u.second); } } } void Solve() { for (int i = 0; i < k; ++i) Dijkstra(v[i], d[i]); if (k == 2) cout << d[0][v[1]]; else if (k == 3) { ll ans(Inf); for (int i = 1; i <= n; ++i) ans = min(ans, d[0][i] + d[1][i] + d[2][i]); cout << ans; } else { for (int i = 0; i < k; ++i) for (int j = 0; j < k; ++j) if (i != j) Dijkstra2(i, j); int a[] = {0, 1, 2, 3, 4}; ll ans(Inf); do { for (int i = 1; i <= n; ++i) ans = min(ans, d2[a[0]][a[1]][i] + d2[a[2]][a[3]][i] + (k == 5 ? d[a[4]][i] : 0)); } while (next_permutation(a, a + k)); cout << ans; } } int32_t main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); int t(1); if (typetest) cin >> t; for (int _ = 1; _ <= t; ++_) { Read(); Solve(); } }
#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...