제출 #223812

#제출 시각아이디문제언어결과실행 시간메모리
223812Ruxandra985Commuter Pass (JOI18_commuter_pass)C++14
0 / 100
321 ms29672 KiB
#include <bits/stdc++.h> #define INF 200000000000000LL #define DIMN 100010 using namespace std; long long d[DIMN] , ds[DIMN] , dt[DIMN]; long long dp[3][DIMN]; vector <pair <int,long long> > v[DIMN] , w[DIMN]; priority_queue <pair <long long,int> > h; priority_queue <pair <long long , pair <int,int> > > hp; struct idk{ int x , y; long long z; } mch[2*DIMN]; int n; void dijkstra (int s , long long d[]){ int i , nod , vecin; long long cost , c; for (i = 1 ; i <= n ; i++) d[i] = INF; d[s] = 0; h.push(make_pair( 0 , s )); while (!h.empty()){ nod = h.top().second; cost = -h.top().first; h.pop(); if (d[nod] != cost) continue; for (i = 0 ; i < v[nod].size() ; i++){ vecin = v[nod][i].first; c = v[nod][i].second; if (d[vecin] > d[nod] + c){ d[vecin] = d[nod] + c; h.push(make_pair(-d[vecin] , vecin)); } } } } int main() { FILE *fin = stdin; FILE *fout = stdout; int i , m , s , t , u , vv , nod , vecin , x , y , z , stare; long long c , cost; fscanf (fin,"%d%d%d%d%d%d",&n,&m,&s,&t,&u,&vv); for (i = 1 ; i <= m ; i++){ fscanf (fin,"%d%d%d",&x,&y,&z); v[x].push_back(make_pair(y , z)); v[y].push_back(make_pair(x , z)); mch[i] = {x , y , z}; } /// un dijkstra din s dijkstra (s , ds); /// un dijkstra din t dijkstra (t , dt); /// inca un dijkstra dar pe w intre u si v for (i = 1 ; i <= n ; i++) dp[0][i] = dp[1][i] = dp[2][i] = INF; if (ds[u] + dt[u] == ds[t]){ dp[1][u] = 0; hp.push(make_pair( 0 , make_pair(1 , u) )); } else { dp[0][u] = 0; hp.push(make_pair( 0 , make_pair(0 , u) )); } while (!hp.empty()){ nod = hp.top().second.second; stare = hp.top().second.first; cost = -hp.top().first; hp.pop(); if (dp[stare][nod] != cost) continue; for (i = 0 ; i < v[nod].size() ; i++){ vecin = v[nod][i].first; c = v[nod][i].second; if (stare == 0){ if (ds[vecin] + dt[vecin] == ds[t]){ /// schimba starea if (dp[1][vecin] > dp[0][nod] + c){ dp[1][vecin] = dp[0][nod] + c; hp.push(make_pair( -dp[1][vecin] , make_pair(1 , vecin) )); } } if (dp[0][vecin] > dp[0][nod] + c){ dp[0][vecin] = dp[0][nod] + c; hp.push(make_pair( -dp[0][vecin] , make_pair(0 , vecin) )); } } else if (stare == 1){ if (ds[vecin] + dt[nod] + c == ds[t]){ if (dp[1][vecin] > dp[1][nod]){ /// pastrezi starea 1 dp[1][vecin] = dp[1][nod]; hp.push(make_pair( -dp[1][vecin] , make_pair(1 , vecin) )); } } else { if (dp[2][vecin] > dp[1][nod] + c){ /// schimbi starea dp[2][vecin] = dp[1][nod] + c; hp.push(make_pair( -dp[2][vecin] , make_pair(2 , vecin) )); } } } else { if (dp[2][vecin] > dp[2][nod] + c){ /// pastrezi starea 1 dp[2][vecin] = dp[2][nod] + c; hp.push(make_pair( -dp[2][vecin] , make_pair(2 , vecin) )); } } } } fprintf (fout,"%lld",min(dp[0][vv] , min(dp[1][vv] , dp[2][vv]))); return 0; }

컴파일 시 표준 에러 (stderr) 메시지

commuter_pass.cpp: In function 'void dijkstra(int, long long int*)':
commuter_pass.cpp:38:24: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for (i = 0 ; i < v[nod].size() ; i++){
                      ~~^~~~~~~~~~~~~~~
commuter_pass.cpp: In function 'int main()':
commuter_pass.cpp:99:24: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for (i = 0 ; i < v[nod].size() ; i++){
                      ~~^~~~~~~~~~~~~~~
commuter_pass.cpp:58:12: warning: ignoring return value of 'int fscanf(FILE*, const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     fscanf (fin,"%d%d%d%d%d%d",&n,&m,&s,&t,&u,&vv);
     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
commuter_pass.cpp:61:16: warning: ignoring return value of 'int fscanf(FILE*, const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         fscanf (fin,"%d%d%d",&x,&y,&z);
         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...