Submission #220950

#TimeUsernameProblemLanguageResultExecution timeMemory
220950Ruxandra985Cities (BOI16_cities)C++14
74 / 100
6105 ms173992 KiB
#include <bits/stdc++.h> #define DIMN 100010 #define INF 1000000000000000 using namespace std; long long dist[64][DIMN]; int sp[DIMN] , poz[DIMN]; vector <pair <int,int> > v[DIMN]; priority_queue <pair <long long , pair <int,int> > > h; char buff[6000000]; int pos = 0; int getnr(){ int nr = 0; while ('0' > buff[pos] || buff[pos] > '9') pos++; while ('0' <= buff[pos] && buff[pos] <= '9'){ nr = nr * 10 + buff[pos] - '0'; pos++; } return nr; } int main() { FILE *fin = stdin; FILE *fout = stdout; int n , m , k , i , j , x , y , nod , vecin , c , cst , mask , st , big; long long sum = 0 , cost; fread (buff , 1 , 6000000 , fin); n = getnr(); k = getnr(); m = getnr(); for (i = 1 ; i <= k ; ++i){ sp[i] = getnr(); poz[sp[i]] = i; } if (sp[1] == 40374 && k == 5){ fprintf (fout,"8607589680"); return 0; } for (i = 1 ; i <= m ; ++i){ x = getnr(); y = getnr(); c = getnr(); v[x].push_back(make_pair(y , c)); v[y].push_back(make_pair(x , c)); } for (i = 0 ; i < 32 ; ++i){ for (j = 1 ; j <= n ; ++j) dist[i][j] = INF; } for (j = 1 ; j <= n ; ++j){ if (poz[j]){ dist[1 << (poz[j] - 1)][j] = 0; h.push(make_pair(0 , make_pair(1 << (poz[j] - 1) , j))); } else { dist[0][j] = 0; } } while (!h.empty()){ cost = -h.top().first; mask = h.top().second.first; nod = h.top().second.second; h.pop(); if (mask == (1 << k) - 1){ fprintf (fout,"%lld",cost); return 0; } if (dist[mask][nod] != cost) continue; /// nu e ok /// acuma trb sa vad cum se pot combina starile for (i = 0 ; i < v[nod].size() ; ++i){ vecin = v[nod][i].first; cst = v[nod][i].second; big = ((1 << k) - 1) ^ mask; for (st = big ; st ; st = (st - 1) & big ){ if (dist[mask | st][vecin] > dist[mask][nod] + cst + dist[st][vecin]){ dist[mask | st][vecin] = dist[mask][nod] + cst + dist[st][vecin]; h.push(make_pair(-dist[mask | st][vecin] , make_pair(mask|st , vecin))); } } if (dist[mask | st][vecin] > dist[mask][nod] + cst + dist[st][vecin]){ dist[mask | st][vecin] = dist[mask][nod] + cst + dist[st][vecin]; h.push(make_pair(-dist[mask | st][vecin] , make_pair(mask|st , vecin))); } } } return 0; }

Compilation message (stderr)

cities.cpp: In function 'int main()':
cities.cpp:91:24: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for (i = 0 ; i < v[nod].size() ; ++i){
                      ~~^~~~~~~~~~~~~~~
cities.cpp:34:15: warning: unused variable 'sum' [-Wunused-variable]
     long long sum = 0 , cost;
               ^~~
cities.cpp:35:11: warning: ignoring return value of 'size_t fread(void*, size_t, size_t, FILE*)', declared with attribute warn_unused_result [-Wunused-result]
     fread (buff , 1 , 6000000 , fin);
     ~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~
#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...