Submission #1268141

#TimeUsernameProblemLanguageResultExecution timeMemory
1268141huypham2009Cities (BOI16_cities)C++20
100 / 100
1222 ms44652 KiB
#include <bits/stdc++.h> using namespace std; #define int long long const int INF=1e18; const int maxn=1e5+5; int32_t MASK(int n) { return 1<<n; } int n,k,m,dp[(1<<5)][maxn],imv[5]; vector<pair<int,int>>g[maxn]; void dijsktra(int *dist) { priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>>pq; for(int i=1;i<=n;i++) { if(dist[i]!=INF) pq.push({dist[i],i}); } while(!pq.empty()) { pair<int,int>tmp=pq.top(); pq.pop(); int d=tmp.first,u=tmp.second; if(dist[u]<d) continue; for(pair<int,int>x:g[u]) { if(d+x.second<dist[x.first]) { dist[x.first]=dist[u]+x.second; pq.push({dist[x.first],x.first}); } } } } int32_t main() { ios_base::sync_with_stdio(0); cin.tie(0); cin>>n>>k>>m; for(int i=0;i<k;i++) cin>>imv[i]; for(int i=1;i<=m;i++) { int u,v,w; cin>>u>>v>>w; g[u].push_back({v,w}); g[v].push_back({u,w}); } for(int mask=0;mask<MASK(k);mask++) { for(int i=0;i<=n;i++) { dp[mask][i]=INF; } } for(int i=0;i<k;i++) dp[MASK(i)][imv[i]]=0; for(int mask=1;mask<MASK(k);mask++) { for(int i=1;i<=n;i++) { for(int submask=mask;submask>=0;submask=(submask-1)&mask) { dp[mask][i]=min(dp[mask][i],dp[mask^submask][i]+dp[submask][i]); if(submask==0) break; } } dijsktra(dp[mask]); } cout<<dp[MASK(k)-1][imv[0]]; 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...