Submission #228686

#TimeUsernameProblemLanguageResultExecution timeMemory
228686Ruxandra985Olympic Bus (JOI20_ho_t4)C++14
5 / 100
1097 ms226900 KiB
#include <bits/stdc++.h> #define DIMN 210 #define INF 2000000000000000 using namespace std; long long dp[DIMN][50010][2]; priority_queue <pair < pair <long long , long long > , pair <long long , long long > > > h; vector <pair <long long , pair <long long , long long > > > v[DIMN]; struct idk{ long long x , y , z , c; } mch[50010]; int main() { FILE *fin = stdin; FILE *fout = stdout; long long n , m , x , y , z , c , i , dist , nod , vecin , cost , stare , j , taken; fscanf (fin,"%lld%lld",&n,&m); for (i = 1 ; i <= m ; i++){ fscanf (fin,"%lld%lld%lld%lld",&x,&y,&z,&c); v[x].push_back(make_pair(y , make_pair(z , i))); mch[i] = {x , y , z , c}; } /// acum faci cele 2 dijkstra uri for (i = 1 ; i <= n ; i++) for (j = 0 ; j <= m ; j++) dp[i][j][0] = dp[i][j][1] = INF; for (j = 0 ; j <= m ; j++){ dp[1][j][0] = mch[j].c; h.push(make_pair(make_pair(-mch[j].c , 1) , make_pair(0 , j))); } while (!h.empty()){ dist = -h.top().first.first; nod = h.top().first.second; stare = h.top().second.first; taken = h.top().second.second; h.pop(); if (dp[nod][taken][stare] != dist) continue; if (nod == 1 && stare == 1){ fprintf (fout,"%lld",dist); return 0; } //printf ("%lld %lld %lld %lld\n" , nod , stare , taken , dist); if (nod == mch[taken].y){ /// caz particular, parcurg muchia intoarsa /// parcurgi muchia inversa vecin = mch[taken].x; cost = mch[taken].z; if (vecin == n && stare == 0){ /// cazul cand se schimba starea if (dp[vecin][taken][1] > dist + cost){ dp[vecin][taken][1] = dist + cost; h.push(make_pair( make_pair( -dp[vecin][taken][1] , vecin ) , make_pair( 1 , taken ) )); } } else { if (dp[vecin][taken][stare] > dist + cost){ dp[vecin][taken][stare] = dist + cost; h.push(make_pair( make_pair( -dp[vecin][taken][stare] , vecin ) , make_pair( stare , taken ) )); } } } for (i = 0 ; i < v[nod].size() ; i++){ vecin = v[nod][i].first; cost = v[nod][i].second.first; if (v[nod][i].second.second == taken) continue; if (vecin == n && stare == 0){ /// cazul cand se schimba starea if (dp[vecin][taken][1] > dist + cost){ dp[vecin][taken][1] = dist + cost; h.push(make_pair( make_pair( -dp[vecin][taken][1] , vecin ) , make_pair( 1 , taken ) )); } } else { if (dp[vecin][taken][stare] > dist + cost){ dp[vecin][taken][stare] = dist + cost; h.push(make_pair( make_pair( -dp[vecin][taken][stare] , vecin ) , make_pair( stare , taken ) )); } } } } fprintf (fout,"-1"); return 0; }

Compilation message (stderr)

ho_t4.cpp: In function 'int main()':
ho_t4.cpp:88:24: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for (i = 0 ; i < v[nod].size() ; i++){
                      ~~^~~~~~~~~~~~~~~
ho_t4.cpp:23:12: warning: ignoring return value of 'int fscanf(FILE*, const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     fscanf (fin,"%lld%lld",&n,&m);
     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
ho_t4.cpp:26:16: warning: ignoring return value of 'int fscanf(FILE*, const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         fscanf (fin,"%lld%lld%lld%lld",&x,&y,&z,&c);
         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...