Submission #1189988

#TimeUsernameProblemLanguageResultExecution timeMemory
1189988AlgorithmWarriorCities (BOI16_cities)C++20
100 / 100
1482 ms42940 KiB
#include <bits/stdc++.h> using namespace std; long long const INF=1e18; int const MAX=100005; int n,k,m; int cities[7]; struct edge{ int nod,len; }; vector<edge>G[MAX]; long long dist[MAX][35]; void read(){ cin>>n>>k>>m; int i; for(i=1;i<=k;++i) cin>>cities[i]; for(i=1;i<=m;++i){ int a,b,c; cin>>a>>b>>c; G[a].push_back({b,c}); G[b].push_back({a,c}); } } struct path{ int nod; long long dst; }; class cmp{ public: bool operator()(path a,path b){ return a.dst>b.dst; } }; void dijkstra(int mask){ int i; priority_queue<path,vector<path>,cmp>pq; for(i=1;i<=n;++i) pq.push({i,dist[i][mask]}); while(!pq.empty()){ auto [nd,dst]=pq.top(); pq.pop(); if(dst!=dist[nd][mask]) continue; for(auto [vec,len] : G[nd]) if(dist[vec][mask]>dst+len){ dist[vec][mask]=dst+len; pq.push({vec,dist[vec][mask]}); } } } void minself(long long& x,long long val){ if(x>val) x=val; } void dijkstra_driver(){ int i,mask; for(mask=1;mask<=k;++mask) for(i=1;i<=n;++i) if(cities[mask]==i) dist[i][1<<(mask-1)]=0; else dist[i][1<<(mask-1)]=INF; for(mask=1;mask<(1<<k);++mask){ if(__builtin_popcount(mask)>1){ for(i=1;i<=n;++i) dist[i][mask]=INF; } int submask=(mask-1)&mask; for(;submask;submask=(submask-1)&mask) for(i=1;i<=n;++i) minself(dist[i][mask],dist[i][submask]+dist[i][mask^submask]); dijkstra(mask); } } long long solve(){ int i; long long ans=INF; for(i=1;i<=n;++i) minself(ans,dist[i][(1<<k)-1]); return ans; } int main() { read(); dijkstra_driver(); cout<<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...