Submission #1315752

#TimeUsernameProblemLanguageResultExecution timeMemory
1315752boclobanchatCities (BOI16_cities)C++20
100 / 100
1594 ms35956 KiB
#include<bits/stdc++.h> using namespace std; const int MAXN=1e5+5; const long long INF=1e18; long long dp[36][MAXN],pos[36]; priority_queue< pair<long long,int>,vector< pair<long long,int> >,greater< pair<long long,int> > > pq; vector< pair<int,int> > ds[MAXN]; int getlog(long long n) { return 63-__builtin_clzll(n); } int main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n,k,m; cin>>n>>k>>m; for(int i=0;i<k;i++) cin>>pos[i]; for(int i=1;i<=m;i++) { int l,r,v; cin>>l>>r>>v; ds[l].push_back({r,v}),ds[r].push_back({l,v}); } for(int i=1;i<(1<<k);i++) { for(int j=1;j<=n;j++) dp[i][j]=INF; if(__builtin_popcount(i)==1) dp[i][pos[getlog(i)]]=0; else for(int j=(i-1)&i;j;j=(j-1)&i) for(int k=1;k<=n;k++) dp[i][k]=min(dp[i][k],dp[j][k]+dp[i-j][k]); for(int j=1;j<=n;j++) pq.push({dp[i][j],j}); while(!pq.empty()) { long long a=pq.top().first,b=pq.top().second; pq.pop(); if(dp[i][b]<a) continue; for(auto v:ds[b]) if(dp[i][v.first]>a+v.second) pq.push({dp[i][v.first]=a+v.second,v.first}); } } long long ans=INF; for(int i=1;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...