Submission #1245774

#TimeUsernameProblemLanguageResultExecution timeMemory
1245774baotoan655Cities (BOI16_cities)C++20
100 / 100
751 ms32428 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; #define int long long const int INF = 1e16; void solve(int tc) { int n, k, m; cin >> n >> k >> m; vector<int> imp(k); for (auto& i : imp) { cin >> i, i--; } k--; vector<vector<pair<int, int>>> adj(n); for (int i = 0; i < m; i++) { int a, b, c; cin >> a >> b >> c; a--, b--; adj[a].emplace_back(b, c); adj[b].emplace_back(a, c); } vector<vector<int>> dp(1 << k, vector<int>(n, INF)); for (int i = 0; i < k; i++) { dp[1 << i][imp[i]] = 0; } for (int mask = 1; mask < 1 << k; mask++) { for (int nmask = 1; nmask < mask; nmask++) { if ((nmask | mask) != mask) continue; int tmp = nmask ^ mask; if (tmp < nmask) continue; for (int i = 0; i < n; i++) { dp[mask][i] = min(dp[mask][i], dp[nmask][i] + dp[tmp][i]); } } priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq; for (int i = 0; i < n; i++) { if (dp[mask][i] == INF) continue; pq.emplace(dp[mask][i], i); } vector<int> vis(n); while (!pq.empty()) { auto [w, u] = pq.top(); pq.pop(); if (vis[u]) continue; vis[u] = 1; for (auto [v, vw] : adj[u]) { if (dp[mask][v] <= w + vw) continue; dp[mask][v] = w + vw; pq.emplace(dp[mask][v], v); } } } cout << dp[(1 << k) - 1][imp[k]] << '\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...