Submission #544949

#TimeUsernameProblemLanguageResultExecution timeMemory
544949MilosMilutinovicCities (BOI16_cities)C++14
100 / 100
2619 ms42812 KiB
#include<bits/stdc++.h> #define fi first #define se second #define pb push_back #define mp make_pair using namespace std; typedef long long ll; typedef unsigned long long ull; typedef pair<int,int> pii; typedef pair<ll,ll> pll; template<typename T> bool chkmin(T&x,T y){return x<y?x=y,1:0;} template<typename T> bool chkmax(T&x,T y){return x>y?x=y,1:0;} const ll inf=(ll)1e18; int n,k,m,id[100005]; ll dist[100005][1<<5]; vector<pii> g[100005]; priority_queue<pair<ll,int>> que; void dijkstra(int mask){ for(int i=1;i<=n;i++)if(dist[i][mask]!=inf)que.push(mp(-dist[i][mask],i)); while(!que.empty()){ ll d=-que.top().first; int u=que.top().second; que.pop(); if(dist[u][mask]<d)continue; for(auto e:g[u]){ int v=e.first,w=e.second; if(dist[v][mask]>dist[u][mask]+w){ dist[v][mask]=dist[u][mask]+w; que.push(mp(-dist[v][mask],v)); } } } } int main(){ scanf("%d%d%d",&n,&k,&m); for(int i=1;i<=n;i++)id[i]=-1; for(int i=1;i<=n;i++)for(int j=0;j<(1<<k);j++)dist[i][j]=inf; for(int i=1;i<=k;i++){ int x;scanf("%d",&x); id[x]=i-1; dist[x][1<<(i-1)]=0; } for(int i=1;i<=m;i++){ int u,v,w;scanf("%d%d%d",&u,&v,&w); g[u].pb(mp(v,w)); g[v].pb(mp(u,w)); } for(int mask=1;mask<(1<<k);mask++){ if(__builtin_popcount(mask)>1){ for(int s=((mask-1)&mask);s>0;s=((s-1)&mask)){ for(int i=1;i<=n;i++)dist[i][mask]=min(dist[i][mask],dist[i][s]+dist[i][mask^s]); } } dijkstra(mask); } ll ans=inf; for(int i=1;i<=n;i++)ans=min(ans,dist[i][(1<<k)-1]); printf("%lld",ans); return 0; }

Compilation message (stderr)

cities.cpp: In function 'int main()':
cities.cpp:42:7: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   42 |  scanf("%d%d%d",&n,&k,&m);
      |  ~~~~~^~~~~~~~~~~~~~~~~~~
cities.cpp:46:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   46 |   int x;scanf("%d",&x);
      |         ~~~~~^~~~~~~~~
cities.cpp:50:18: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   50 |   int u,v,w;scanf("%d%d%d",&u,&v,&w);
      |             ~~~~~^~~~~~~~~~~~~~~~~~~
#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...