제출 #1245784

#제출 시각아이디문제언어결과실행 시간메모리
1245784phuonglinhn09Cities (BOI16_cities)C++20
100 / 100
1947 ms50916 KiB
/** * author: phuonglinhn09 * created: 23.07.2025 */ #include <bits/stdc++.h> using namespace std; typedef long long ll; const int nmax = 1e5; const ll inf = 1e18; ll n, k, m, dp[nmax + 5][40]; vector<pair<int, ll>> adj[nmax + 5]; namespace SOLVE{ void solve() { for (int mask = 1; mask < (1 << k); mask++) { priority_queue<pair<ll,ll>, vector<pair<ll,ll>>, greater<pair<ll,ll>>> pq; for (int i = 1; i <= n; i++) { for (int sub = mask; sub > 0; sub = (sub - 1) & mask){ dp[i][mask] = min(dp[i][mask], dp[i][sub] + dp[i][mask ^ sub]); } if (dp[i][mask] < inf) pq.emplace(dp[i][mask],i); } while (!pq.empty()) { auto [cur, u] = pq.top(); pq.pop(); if (cur > dp[u][mask]) continue; for (auto [v,w]:adj[u]) { if (dp[v][mask] > cur + w){ dp[v][mask] = cur + w; pq.emplace(dp[v][mask],v); } } } } ll ans = inf; for (int u = 1; u <= n; u++) ans = min(ans, dp[u][(1 << k) - 1]); cout << ans; } } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> n >> k >> m; memset(dp, 0x3f, sizeof dp); for (int i = 0; i < k; i++) { int u; cin >> u; dp[u][1 << i] = 0; } for (int i = 1; i <= m; i++) { int u, v, w; cin >> u >> v >> w; adj[u].emplace_back(v, w); adj[v].emplace_back(u, w); } SOLVE::solve(); 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...