Submission #45071

#TimeUsernameProblemLanguageResultExecution timeMemory
45071nibnalinCities (BOI16_cities)C++17
51 / 100
4045 ms56872 KiB
#include <iostream> #include <cstdio> #include <vector> #include <set> using namespace std; typedef long long int lli; const lli maxn = lli(1e5)+5, maxk = 6, inf = lli(1e17)+5; lli n, D[maxk][maxn], dp[(1<<maxk)][maxn], A[maxk]; vector<pair<lli, lli>> graph[maxn]; void dijkstra(lli type, lli node) { for(lli i = 0;i < n;i++) D[type][i] = inf; D[type][node] = 0; set<pair<lli, lli>> Q; Q.insert({D[type][node], node}); while(!Q.empty()) { pair<lli, lli> top = *Q.begin(); Q.erase(Q.begin()); for(auto it: graph[top.second]) { if(D[type][it.first] > D[type][top.second]+it.second) { if(D[type][it.first] != inf) Q.erase({D[type][it.first], it.first}); D[type][it.first] = D[type][top.second]+it.second; Q.insert({D[type][it.first], it.first}); } } } } int main(void) { lli k, m, u, v, w; scanf("%lld%lld%lld", &n, &k, &m); for(lli i = 0;i < k;i++) { scanf("%lld", &A[i]); A[i]--; } for(lli i = 0;i < m;i++) { scanf("%lld%lld%lld", &u, &v, &w); u--, v--; graph[u].push_back({v, w}), graph[v].push_back({u, w}); } for(lli i = 0;i < k;i++) dijkstra(i, A[i]); for(lli mask = 1;mask < (1<<k);mask++) { set<pair<lli, lli>> Q; for(lli i = 0;i < n;i++) { dp[mask][i] = inf; for(lli j = 0;j < k;j++) { if((mask&(1<<j))) dp[mask][i] = min(dp[mask][i], dp[(mask^(1<<j))][i]+D[j][i]); } Q.insert({dp[mask][i], i}); } while(!Q.empty()) { pair<lli, lli> top = *Q.begin(); Q.erase(Q.begin()); for(auto it: graph[top.second]) { if(dp[mask][it.first] > dp[mask][top.second]+it.second) { Q.erase({dp[mask][it.first], it.first}); dp[mask][it.first] = dp[mask][top.second]+it.second; Q.insert({dp[mask][it.first], it.first}); } } } } lli res = inf; for(lli i = 0;i < n;i++) res = min(res, dp[(1<<k)-1][i]); printf("%lld\n", res); }

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]
  scanf("%lld%lld%lld", &n, &k, &m);
  ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~
cities.cpp:45:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%lld", &A[i]);
   ~~~~~^~~~~~~~~~~~~~~
cities.cpp:51:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%lld%lld%lld", &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...