Submission #228715

#TimeUsernameProblemLanguageResultExecution timeMemory
228715Ruxandra985Olympic Bus (JOI20_ho_t4)C++14
5 / 100
1103 ms147352 KiB
#include <bits/stdc++.h> #define DIMN 210 #define INF 2000000000 using namespace std; int dp[2][DIMN][50010]; priority_queue <pair < pair <int , int > , pair <int , int > > > h; vector <pair <int , pair <int , int > > > v[DIMN]; struct idk{ int x , y , z , c; } mch[50010]; int main() { FILE *fin = stdin; FILE *fout = stdout; int n , m , x , y , z , c , i , dist , nod , vecin , cost , stare , j , taken; fscanf (fin,"%d%d",&n,&m); for (i = 1 ; i <= m ; i++){ fscanf (fin,"%d%d%d%d",&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[0][i][j] = dp[1][i][j] = INF; for (j = 0 ; j <= m ; j++){ dp[0][1][j] = 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[stare][nod][taken] != dist) continue; if (nod == 1 && stare == 1){ fprintf (fout,"%d",dist); return 0; } //printf ("%d %d %d %d\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[1][vecin][taken] > dist + cost){ dp[1][vecin][taken] = dist + cost; h.push(make_pair( make_pair( -dp[1][vecin][taken] , vecin ) , make_pair( 1 , taken ) )); } } else { if (dp[stare][vecin][taken] > dist + cost){ dp[stare][vecin][taken] = dist + cost; h.push(make_pair( make_pair( -dp[stare][vecin][taken] , 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[1][vecin][taken] > dist + cost){ dp[1][vecin][taken] = dist + cost; h.push(make_pair( make_pair( -dp[1][vecin][taken] , vecin ) , make_pair( 1 , taken ) )); } } else { if (dp[stare][vecin][taken] > dist + cost){ dp[stare][vecin][taken] = dist + cost; h.push(make_pair( make_pair( -dp[stare][vecin][taken] , 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,"%d%d",&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,"%d%d%d%d",&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...