제출 #1245772

#제출 시각아이디문제언어결과실행 시간메모리
1245772baotoan655Cities (BOI16_cities)C++20
74 / 100
6095 ms165356 KiB
#include <bits/stdc++.h> #define file(name) if (fopen(name".inp", "r")) { freopen(name".inp", "r", stdin); freopen(name".out", "w", stdout); } #define ll long long #define fi first #define se second using namespace std; const int N = 1e5 + 5; int n, m, k; vector<pair<int, int>> g[N]; ll d[N][1 << 5]; int tt[N]; struct state { int u, mask; ll w; bool operator < (const state &o) const { return w > o.w; } }; void solve(int tc) { cin >> n >> k >> m; for(int i = 0; i < k; ++i) { int x; cin >> x; tt[x] = (1 << i); } for(int i = 1; i <= m; ++i) { int u, v, c; cin >> u >> v >> c; g[u].emplace_back(v, c); g[v].emplace_back(u, c); } memset(d, 0x3f, sizeof d); priority_queue<state> pq; for(int i = 1; i <= n; ++i) { d[i][tt[i]] = 0; pq.push({i, tt[i], 0}); } while(!pq.empty()) { auto [u, mask, kc] = pq.top(); pq.pop(); if(d[u][mask] != kc) continue; for(auto [v, c] : g[u]) { int newMask = mask | tt[v]; if(d[v][newMask] > d[u][mask] + c) { d[v][newMask] = d[u][mask] + c; pq.push({v, newMask, d[v][newMask]}); } } for(int pre = 0; pre < (1 << k); ++pre) { int newMask = pre | mask; if(d[u][newMask] > d[u][mask] + d[u][pre]) { d[u][newMask] = d[u][mask] + d[u][pre]; pq.push({u, newMask, d[u][newMask]}); } } } ll ans = 1e16; for(int i = 1; i <= n; ++i) { ans = min(ans, d[i][(1 << k) - 1]); } cout << ans << '\n'; return; } int32_t main() { ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); // file("A") else file("task"); int tc = 1; // cin >> tc; for(int i = 1; i <= tc; ++i) solve(i); 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...