Submission #1294389

#TimeUsernameProblemLanguageResultExecution timeMemory
1294389trantrungkeinCities (BOI16_cities)C++20
100 / 100
1305 ms42216 KiB
#include<bits/stdc++.h> #define int long long using namespace std; const int INF = 1e16; const int N = 2e5 + 7; int n,m,k,par[N],dist[N],vis[N],span = 0,root,spec[N]; vector<pair<int,int>> g[N]; int dp[(1<<5)+1][100005]; int32_t main(){ cin >> n >> k >> m; for(int i = 0; i < k; i++){ cin >> spec[i]; spec[i]--; } for(int i = 1; i <= m; i++){ int u,v,w; cin >> u >> v >> w; u--; v--; g[u].push_back({v,w}); g[v].push_back({u,w}); } int len = (1<<k); for(int mask = 0; mask < len; mask++){ for(int i = 0; i < n; i++){ dp[mask][i] = INF; } } for(int i = 0; i < k; i++) dp[(1<<i)][spec[i]] = 0; priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>> q; for(int mask = 1; mask < len; mask++){ if((mask&(mask-1))!=0){ for(int i = 0; i < n; i++){ for(int sub = (mask-1)&mask; sub>0; sub = (sub-1)&mask){ if(dp[sub][i] != INF && dp[mask^sub][i] != INF){ dp[mask][i] = min(dp[mask][i],dp[sub][i]+dp[mask^sub][i]); } } } } for(int i = 0; i < n; i++) if(dp[mask][i] != INF) q.push({dp[mask][i],i}); while(!q.empty()){ auto [W,u] = q.top(); q.pop(); if(W > dp[mask][u]) continue; for(auto [v,w] : g[u]){ if(dp[mask][v] > dp[mask][u] + w){ dp[mask][v] = dp[mask][u] + w; q.push({dp[mask][v],v}); } } } } int ans = INF; for(int i = 0; i < n; i++) ans = min(ans,dp[(1<<k)-1][i]); cout << ans; }
#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...