Submission #563340

#TimeUsernameProblemLanguageResultExecution timeMemory
563340abcvuitunggioCities (BOI16_cities)C++17
100 / 100
2531 ms49800 KiB
#include <iostream> #include <queue> #include <vector> using namespace std; typedef long long ll; const ll mx=1000000000000000001; ll l[100001],dp[100001][32],res=mx; int n,m,k,a[100001],u,v,w; vector <pair <ll, int> > ke[100001]; void dijkstra(){ priority_queue <pair <ll, int>, vector <pair <ll, int> >, greater <pair <ll, int> > > q; for (int i=1;i<=n;i++) q.push({l[i],i}); while (!q.empty()){ int u=q.top().second; ll lu=q.top().first; q.pop(); if (l[u]!=lu) continue; for (auto v:ke[u]) if (l[v.first]>l[u]+v.second){ l[v.first]=l[u]+v.second; q.push({l[v.first],v.first}); } } } int main(){ ios_base::sync_with_stdio(NULL);cin.tie(nullptr); cin >> n >> k >> m; for (int i=1;i<=n;i++){ l[i]=mx; for (int j=0;j<(1<<k);j++) dp[i][j]=mx; } for (int i=0;i<k;i++){ cin >> a[i]; dp[a[i]][1<<i]=0; } for (int i=0;i<m;i++){ cin >> u >> v >> w; ke[u].push_back({v,w}); ke[v].push_back({u,w}); } for (int mask=0;mask<(1<<k);mask++){ for (int i=0;i<(1<<k);i++) if ((mask&i)==i) for (int l=1;l<=n;l++) dp[l][mask]=min(dp[l][mask],dp[l][i]+dp[l][mask^i]); for (int i=1;i<=n;i++) l[i]=dp[i][mask]; dijkstra(); for (int i=1;i<=n;i++) dp[i][mask]=l[i]; } for (int i=1;i<=n;i++) res=min(res,dp[i][(1<<k)-1]); cout << res; }
#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...