Submission #1245817

#TimeUsernameProblemLanguageResultExecution timeMemory
1245817nguyendinhtienCities (BOI16_cities)C++17
100 / 100
2249 ms58748 KiB
#include <bits/stdc++.h> #define N 100000 #define ll long long #define MOD 1000000007 #define inf 2000000000 #define llf 1000000000000000000 // #define base 31 #define MASK(i) (1 << (i)) #define BIT(x, i) (((x) >> (i)) & 1) #define pii pair<int, int> #define pll pair<ll, ll> #define pil pair<int, ll> #define pli pair<ll, int> #define fi first #define se second #define el '\n' using namespace std; int n, m, K; vector<pil> adj[N + 5]; ll dp[N + 5][50]; void solve() { for(int mask = 0; mask < (1 << K); mask++) { if(!mask) continue; for(int sub = (mask - 1) & mask; sub; sub = (sub - 1) & mask) { int oth = mask ^ sub; for(int u = 1; u <= n; u++) dp[u][mask] = min(dp[u][mask], dp[u][sub] + dp[u][oth]); } priority_queue<pli, vector<pli>, greater<>> pq; for(int u = 1; u <= n; u++) if(dp[u][mask] < llf) pq.emplace(dp[u][mask], u); while(pq.size()) { auto [len, u] = pq.top(); pq.pop(); if(len != dp[u][mask]) continue; for(auto [v, w] : adj[u]) { ll W = len + w; if(dp[v][mask] > W) { dp[v][mask] = W; pq.emplace(W, v); } } } } ll ans = llf; for(int u = 1; u <= n; u++) ans = min(ans, dp[u][(1 << K) - 1]); cout << ans; } int main() { ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); // freopen(".INP", "r", stdin); // freopen(".OUT", "w", stdout); cin >> n >> K >> m; for(int i = 0; i <= n; i++) for(int mask = 0; mask < (1 << K); mask++) dp[i][mask] = llf; for(int u, i = 0; i < K; i++) { cin >> u; dp[u][1 << i] = 0; } for(int u, v, w, i = 1; i <= m; i++) { cin >> u >> v >> w; adj[u].push_back({v, w}); adj[v].push_back({u, w}); } 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...